Objective C - 将文本字段值传递给另一个类中的NSString

时间:2015-08-23 23:17:38

标签: ios objective-c

在我的应用中,用户需要验证他们的电话号码才能注册。在第一个视图中,他们输入他们的电话号码并接收短信。在第二个视图中,他们输入SMS代码,在第三个视图中,他们完成他们的个人资料。

我正在尝试将用户电话号码的值从View 1传递到View 3.

请参阅以下内容:

View1.m

    ProfileCreateViewController *pc = [[ProfileCreateViewController alloc] init];

    pc.userPhoneNumber = [NSString stringWithFormat:@"%@", self.userPhoneNumber.text];

    // Perform segue to View 2

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    EnterCodeViewController* vc = [segue destinationViewController];
    vc.verification = _verification;

}

查看3.h

@interface ProfileCreateViewController : UIViewController

.....

@property (nonatomic, strong) NSString *userPhoneNumber;

@end

View3.m

@synthesize userPhoneNumber;

- (void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@"My phone number is: +1%@", userPhoneNumber);

}

然而,当我到达View3时,在日志中我得到'我的电话号码是+1(空)'

为什么值不传递给View3?

4 个答案:

答案 0 :(得分:2)

如果你正在使用segues,你只需要像这样实现方法prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue.destinationViewController class]
      isSubclassOfClass:[ProfileCreateViewController class]]) {
        ProfileCreateViewController *profileCreateVC =
    (ProfileCreateViewController *)segue.destinationViewController;
        profileCreateVC.userPhoneNumber = [NSString stringWithFormat:@"%@", self.userPhoneNumber.text];
    }
}

答案 1 :(得分:1)

我建议用我的小Objective C经验将对象保存到NSUserDefaults,或者你可以保存字符串然后在第3个视图中检索。

仅保存字符串:

NSUserDefaults *saveNumber = [NSUserDefaults standardUserDefaults];
    [saveNumber setObject:self.userPhoneNumber.text forKey:@"usersPhoneNumber"];
    [saveNumber synchronize];

然后将其加载回View3.m

NSString *phoneNum = [[NSUserDefaults standardDefaults]objectForKey:@"usersPhoneNumber"];
NSLog(@"My phone number is:+1%@",phoneNum);

我不确定这是否是您正在寻找的,但我希望它有所帮助

(为了保存整个对象,您必须在View3.m文件中使用-encodeWithCoder& -initWithCoder并对NSData执行[NSKeyedArchiver archiveWithRootObject:yourObject],然后将NSData保存到NSUserDefaults。

答案 2 :(得分:0)

使用copy而不是strong

@property(非原子,复制)NSString * userPhoneNumber;

检查是否在其他位置将textField的文本设置为nil。 在分配文本以确认文本正在被分配之前使用NSLog,或者使用硬编码字符串来验证您在VC3中确实是nil。

答案 3 :(得分:0)

“为了我将来的参考,我仍然想知道为什么我的代码无效”

你好, 没有完整的代码示例,我很难知道。但是,根据您发布的内容,我认为我的猜测是正确的。

在View1中手动分配/初始化“ProfileCreateViewController”时,您正在创建viewController的实例并在其上设置属性。但是,如果您正在使用viewController2(EnterCodeViewController)中的storyboard segue来显示viewController3(ProfileCreateViewController),则storyboard segue将为您实例化一个ProfileCreateViewController,并且您创建的那个将被忽略。

我相信想要做的是建立某种服务(我想你可以像其他人建议的那样将它存储在NSUserDefaults中)。您可以做的另一件事是在ProfileCreateViewController中创建一个“UserProfile”对象。这将有一个属性“phoneNo”和“verificationCode”。当你获得数据时,你填充对象,然后将对象传递给“EnterCodeViewController”,然后根据预期的代码检查验证,然后如果成功将完整的对象传递给“PrepareForSegue”内的最终viewController(ProfileCreateViewController)。

如果您使用storyboard segue来管理所有Segue,那么您几乎不需要手动分配/初始化viewController。

您可以通过在调试器中暂停并记下您分配/初始化的内存地址来确认这一点,然后再次暂停并在“ProfileCreateViewController”内部获取“self”的内存地址null属性。内存地址会有所不同。

如果您发布更多源代码仍然遇到问题,我可以帮助您。你似乎是iOS开发的新手。我建议你查看“http://www.raywenderlich.com”。这个网站已经被很多人用来学习iOS的基础知识,非常好!希望这会有所帮助。