在另一个文件中使用 NSString 对象总是显示空值?

Posted

技术标签:

【中文标题】在另一个文件中使用 NSString 对象总是显示空值?【英文标题】:used NSString object in another file shown always null value ? 【发布时间】:2013-12-05 09:04:58 【问题描述】:

我有两个 .m 文件。我在另一个 .m 文件上使用了 nsstring 对象,它始终为空。

//postputgetFunction.h

     @property(retain,nonatomic) IBOutlet NSMutableString *postRegisterResponseUserId;

//postputgetFunction.m

  @synthesize postRegisterResponseUserId;

    -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
   
if ([flag isEqualToString:@"post"])

    NSLog(@"Post received data here.....");
    NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    postRegisterResponseName=[dict valueForKey:@"Name"];
    postRegisterResponseSuccess=[dict valueForKey:@"Success"];
    postRegisterResponseUserId=[dict valueForKey:@"UserId"];

    NSLog(@"ReceiveData :Name : %@ \n Success : %@ \n UserId : %@",postRegisterResponseName,postRegisterResponseSuccess,postRegisterResponseUserId);

   //Above statement display the value properly..........

    flag=Nil;


但我在另一个 .m 文件中使用...在这个 .m 文件中,它显示的空值 .. 像这样, //验证.h

    #import "PostPutGetFunction.h"

    @property (retain, nonatomic) PostPutGetFunction *postputgetFunction;

//验证.m

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
postputgetFunction=[[PostPutGetFunction alloc]init];



- (IBAction)verificationBtnClick:(id)sender

    NSLog(@"%@",postputgetFunction.postRegisterResponseUserId);

    //here its always shown NULL ... i didnt get the value here ...

【问题讨论】:

由于您似乎异步获取字符串,我假设您在回调触发之前访问字符串。您将请求发送到哪里? PostPutGetFunction 类包含两个方法 post 并将 ..first post 方法从登录表单调用并将值存储在字符串中并导航到验证 xib。单击该验证类的按钮后,它会执行 verificatinBtnClick 操作以获取 userid 的值 仍然不确定,但我坚持异步问题。您发送请求 -> 导航到 verify.xib -> 获取用户 ID 的值(此处仍为 NULL) -> 服务器现在通过回调进行响应 -> 现在用户 ID 已设置。请求是异步的,意思是:请求发送后,其余代码“沿着请求”执行。 【参考方案1】:

在其他 .m 文件的 viewDidLoad 方法中,您使用

分配和初始化 PostPutGetFunction
postputgetFunction=[[PostPutGetFunction alloc]init];

这就是 PostPutGetFunction 类 NSMutableString *postRegisterResponseUserId 中定义的变量初始化为 Null 的原因。您可以使用 Delegates 在两个控制器之间传递数据。或者,您可以将用户 ID 存储在 NSUserDefault 类中,如下所示

**First Part**
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSString *name =[dict valueForKey:@"Name"];
NSString *success=[dict valueForKey:@"Success"];
NSString *userid =[dict valueForKey:@"UserId"];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

[defaults setObject:name forKey:@"NAME"];
[defaults setObject:success forKey:@"SUCCESS"];
[defaults setObject:userid forKey:@"USERID"];
[defaults synchronize];

要检索另一个 class.m 中的值,请使用以下代码

**Second Part**
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *name = [defaults objectForKey:@"NAME"];
NSString *success = [defaults objectForKey:@"SUCCESS"];
NSString *userid = [defaults objectForKey:@"USERID"];

而且您也不将 IBOutlet 用于 NSMutableString 类型,而是将其用于像下面这样的 UI 控件类型

【讨论】:

让我用谷歌搜索一下:iosdevelopertips.com/objective-c/… @MAC113 查看我编辑的答案我认为您的唯一目标是获取其他 .m 文件中的值。与静态类型相比,这是一种非常直接的方法。 是的,我想在其他页面中获取值,但请在上面的代码中写两次,我没有得到我在代码中使用的确切内容... 请再写一遍我需要的内容 在 postputgetFunction.m connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 方法中,您正在获取 name、success、userid 的值,使用第一部分设置 NSUserDefault 和在 other.m 文件中,使用第二部分获取您之前存储的值,希望这对您有所帮助。【参考方案2】:

您正在声明PostPutGetFunction 的新对象,并且确定postRegisterResponseUserId 的值将为空

如果你想完成你必须使用委托,看看这个answer

【讨论】:

以上是关于在另一个文件中使用 NSString 对象总是显示空值?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL DATETIME 在一个表中显示正确的日期,但在另一个表中显示不正确的时间(总是午夜)?

iOS FontAwesome 在另一个字符串的中间

在 iOS 4.2 SDK 中返回 NSString 的函数总是返回 nil

在另一个视图中显示来自 UIImageView 的照片

什么Objective-C NSString方法需要检查字符串是否包含在另一个字符串中? [重复]

试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中