在我的应用中,用户需要验证他们的电话号码才能注册。在第一个视图中,他们输入他们的电话号码并接收短信。在第二个视图中,他们输入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?
答案 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的基础知识,非常好!希望这会有所帮助。