Iphone 在另一个类中访问一个类的nsmutable字符串将导致null目标c
我正在开发一个非常简单的应用程序,只是为了学习。它将celcius值转换为华氏值。它有一个带有两个uitextfield和一个按钮的单一视图。在第一个uitextfield中输入celcius值并单击按钮后,将调用参数为-voidrequestCelciusandresponseFrnht:NSString*textfieldstring的函数。此方法在名为WebServiceCall的NSOBject类中。发送webservice,解析xml,并将结果填充到名为soapResults的nsstring变量中。下面是我的代码结构: 我有一个NSObject类,变量为soapresults:Iphone 在另一个类中访问一个类的nsmutable字符串将导致null目标c,iphone,Iphone,我正在开发一个非常简单的应用程序,只是为了学习。它将celcius值转换为华氏值。它有一个带有两个uitextfield和一个按钮的单一视图。在第一个uitextfield中输入celcius值并单击按钮后,将调用参数为-voidrequestCelciusandresponseFrnht:NSString*textfieldstring的函数。此方法在名为WebServiceCall的NSOBject类中。发送webservice,解析xml,并将结果填充到名为soapResults的nsst
@interface WebServiceCall : NSObject <UITextFieldDelegate,NSXMLParserDelegate> {
NSString *msgLength;
//web service access
NSMutableData *webData;//contains modifiable data in form of bytes
NSMutableString *soapResults;//To hold the value of fahrenheit from parsed xml resulting thrugh webservice
BOOL elementFound;
ends
NSURLConnection *conn;
NSXMLParser *xmlParser;
-voidrequestCelciusandresponseFrnht:NSString*textfieldstring
实现代码从以下代码开始:
#import "WebServiceCall.h"
@实现WebServiceCall
@综合测试结果
-(void)requestCelciusandresponseFrnht:(NSString *)textfieldstring{
//这里的代码用于soap消息、NSMUtableRequest、http头、主体和NSURLconnection
}
编辑:
-void解析器:NSXMLParser*解析器didEndElement:NSString*elementName namespaceURI:NSString*namespaceURI qualifiedName:NSString*qName
{
}
编辑:现在根据您的建议,在my app delegate类中更改为:
头文件.h:-
@class WebServicesViewController;
@接口WebServicesAppDelegate:NSObject{
NSMutableString*结果
}
@属性非原子,保留IBUIWindow*窗口
@属性非原子,保留IBOutlet WebServicesViewController*viewController;
@属性非原子,保留NSMutableString*结果
@结束
实现文件.m为:
#import "WebServicesAppDelegate.h"
#import "WebServicesViewController.h"
@实现WebServicesAppDelegate
@合成窗口=_窗口;
@综合结果
现在,我正在尝试访问视图控制器中的soapResults变量,如下所示:
-(IBAction) buttonClicked:(id) sender
{NSLog@button单击并将celcius值作为参数发送
clsvarWebServiceCall=[[WebServiceCall alloc]init];
[clsvarWebServiceCall requestandresponsewithfrnhtReq:txtcels.text];
WebServicesAppDelegate *appDelegate=(WebServicesAppDelegate *)[[UIApplication sharedApplication]delegate];
NSLog(@"appDelegate.results of viewController is %@",appDelegate.results);
这里我得到的soapResults值为null
编辑:我的整个nslog/trace:`2011-09-07 15:03:22.948 WebServices[1717:207]视图控制器已加载
2011-09-07 15:03:41.266单击WebServices[1717:207]按钮并将celcius值作为参数发送
2011-09-07 15:03:41.291 WebServices[1717:207]appDelegate.viewController的结果为空
2011-09-07 15:03:41.299 Web服务[1717:207]viewController的soapResults为空
2011-09-07 15:03:42.091 WebServices[1717:207]在nsobject类中调用了DidReceiverResponse方法
2011-09-07 15:03:42.098 Web服务[1717:207]在nsobject类中调用了didReceiveData方法
2011-09-07 15:03:42.103在nsobject类中调用的Web服务[1717:207]ConnectiondFinishLoading方法
2011-09-07 15:03:42.112 Web服务[1717:207]在nsobject类中调用了didStartElement方法
2011-09-07 15:03:42.117 Web服务[1717:207]在nsobject类中调用了didStartElement方法
2011-09-07 15:03:42.122 Web服务[1717:207]在nsobject类中调用了didStartElement方法
2011-09-07 15:03:42.127 Web服务[1717:207]在nsobject类中调用了didStartElement方法
2011-09-07 15:03:42.133 Web服务[1717:207]在nsobject类中调用的foundCharacters方法
2011-09-07 15:03:42.139在nsobject类中调用了WebServices[1717:207]DiEndElement方法
2011-09-07 15:03:42.146 Web服务[1717:207]NSObject类中soapResult的值为:122
2011-09-07 15:03:42.159 Web服务[1717:207]appDelegate.NSObject类的结果值为:122
2011-09-07 15:03:42.175在nsobject类中调用了WebServices[1717:207]DiEndElement方法
2011-09-07 15:03:42.179 Web服务[1717:207]NSObject类中soapResult的值为:122
2011-09-07 15:03:42.184 Web服务[1717:207]appDelegate.NSObject类的结果值为:122
2011-09-07 15:03:42.190在nsobject类中调用了WebServices[1717:207]DiEndElement方法
2011-09-07 15:03:42.196 Web服务[1717:207]NSObject类中soapResult的值为:122
2011-09-07 15:03:42.200 Web服务[1717:207]appDelegate.NSObject类的结果值为:122
2011-09-07 15:03:42.204在nsobject类中调用了WebServices[1717:207]DiEndElement方法
2011-09-07 15:03:42.208 Web服务[1717:207]NSObject类中soapResult的值为:122
2011-09-07 15:03:42.329 Web服务[1717:207]appDelegate.NSObject类的结果值为:122`
如果查看nslog,首先调用视图控制器的soapREsults或AppDelegate.soapREsults,我认为这就是为什么它为null,来自soap结果的结果稍后出现,并且它无法更新视图控制器中的soap结果值?
有什么建议吗?您可以做的一件事是在appDelegate中声明一个全局字符串 NSMutableString*结果 然后,当您在WebServiceCall中获得结果时,将该结果设置为appDelegate中声明的字符串 YourAppDelegateName*appDelegate=YourAppDelegateName*[[UIapplication sharedApplication]委托]; appDelegate.results=[[NSSt 环alloc]init]; appDelegate.results=soapResults 完成此操作后,您可以在应用程序中的任何类上访问它 [clsvarWebServiceCall requestandresponsewithfrnhtReq:txtcels.text]//将celcius值作为参数发送到名为WebServiceCall的NSObject类的方法 写这个 YourAppDelegateName*appDelegate=YourAppDelegateName*[[UIapplication sharedApplication]委托] NSLog@result是%@,appDelegate.results 另一种方法是当您能够获得soapResults时 就在那之后写 [保留] 或者您可以使用singleton类。请检查此文档
尝试通过属性分配结果字符串,并按如下方式访问它
self.soapResults = @"someValue"; //We are setting via property where it will be retained
并从视图控制器访问它
`
`Another thing you can do is Declare object of viewcontroller in NSObject class.
NSobject.h
YourViewControllerName *viewController;
declare the properties and synthesize it in .m file
Declare one string in viewcontroller file
NSMutableString *getResult;
and when you get the result in NSObject class
after that do this
viewController=[[YourViewControllerName alloc]init];
viewController.getResult=[[NSMutableString alloc]init];
viewControoler.getResult=soapResults;
当控件在获得soapResults后返回到viewcontroller时,尝试从viewcontroller进行访问。hi我使用了appdelegate的以下方法,但仍然将值获取为null。我观察到一件奇怪的事情,但我无法理解:在单击按钮并在另一个webservice的NSObjectClass中传递参数之后调用类方法nslog首先为uiviewcontroll提供日志。使用代码:YourAppDelegateName*appDelegate=YourAppDelegateName*[[UIapplication sharedApplication]delegate];NSLog@result是%@,appDelegate.results;。它为null,然后编译器/nslog为NSobject类的soapResult打印值。查看我的编辑您是否在代码中编写了应用程序委托名称而不是AppDelegateName。您能告诉我您在webservicecall类中添加了哪些代码吗?请查看上面的编辑我已尝试提供我认为问题所在的尽可能多的相关信息在对WebService的调用中,类似于:1.button单击并将数据从视图控制器发送到NSObject类。2.现在nsobject类变量soapResults保存解析后的xml中的值。3.现在它将APPDegate文件中的结果值更新为:APPDegate.results=soapResults。4.现在从视图控制器访问此appdelegate.results。但在我的示例中,首先调用视图控制器的appdelegate.results,因此它为null,然后填充nsobject的soapResults值..是的。您是对的。因为appdelegate.results值是首先调用的,所以它为null。所以请尝试在viewcontroller中的其他位置打印值将soapResults设置为NSobject后控件返回的文件。在这里不要忘记释放viewcontroller对象字符串对象,否则会产生内存泄漏。
self.soapResults = @"someValue"; //We are setting via property where it will be retained
`
`Another thing you can do is Declare object of viewcontroller in NSObject class.
NSobject.h
YourViewControllerName *viewController;
declare the properties and synthesize it in .m file
Declare one string in viewcontroller file
NSMutableString *getResult;
and when you get the result in NSObject class
after that do this
viewController=[[YourViewControllerName alloc]init];
viewController.getResult=[[NSMutableString alloc]init];
viewControoler.getResult=soapResults;