我正在实现一个简单的游戏,用户尝试猜测随机选择的卡。他们从一个包含两个组件的选择器中(在FirstViewController中)选择他们的猜测,然后在下一个屏幕(SecondViewController)中,他们可以检查它们是否正确。我现在陷入困境,试图将用户选择的猜测传递到可以检查的屏幕上。
在SecondViewController.h中,我这样声明猜测的两个部分(数字和匹配)的属性:
@property (nonatomic, assign) NSString * guessNumber;
@property (nonatomic, assign) NSString * guessSuit;
然后在FirstViewController.h的didSelectRow中,我试图像这样传递信息:
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
SecondViewController *secondVC = [[SecondViewController alloc] init];
if (component == 0){
secondVC.guessNumber = _cardNumbers[row];
}else{
secondVC.guessSuit = _cardImages[row];
}
[self.navigationController pushViewController:secondVC animated:YES];
}
在用于SecondViewController的viewDidLoad中,我NSLog记录guessNumber和guessSuit的值,但同时为两者打印出null。
显然,如果有人对我需要修复的内容有任何指导,那我在某个地方出错了,并且实际上并没有传递数据,那真是太棒了!
编辑:
我现在将值更改为复制而不是分配,如下所示:
@property (nonatomic, copy) NSString * guessNumber;
@property (nonatomic, copy) NSString * guessSuit;
我也尝试过强大,但都没有用。奇怪的是,如果我在分配值后立即打印出该值,如下所示:
secondVC.guessNumber = _cardNumbers[row];
NSLog(secondVS.guessNumber);
我得到正确的价值。现在,我什至更加困惑,因为当我实际转到第二个视图控制器时,似乎正在分配值,但没有保存它。
最佳答案
assign
告诉NSString *
属性设置器保存指针地址,而不是OC对象本身。_cardNumbers[row]
和_cardImages[row]
都返回一个自动释放的对象,该对象将在完成didSelectRow
方法后被释放,因此您无法在viewDidLoad
的SecondViewController
中获得预期的字符串值。
使用strong
或copy
代替,它告诉属性设置器将值的retain count
增加1,因此SecondViewController
拥有(guessNumber
拥有)字符串值,您可以在其整个生命周期中获取它时间。
关于ios - 在ViewController之间推送数据不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49182506/