我正在实现一个简单的游戏,在该游戏中,用户尝试猜测一张随机选择的纸牌。他们从双组件选择器(在 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 中,我对 guessNumber 和 guessSuit 的值进行了 NSLog,但它为两者打印出 null。
很明显,我在某处出错了,数据实际上并没有被传递,如果有人对我需要修复的内容有任何指导,那就太棒了!
编辑: 我现在将值更改为复制而不是分配,如下所示:
@property (nonatomic, copy) NSString * guessNumber;
@property (nonatomic, copy) NSString * guessSuit;
我也试过 strong ,都没用。奇怪的是,如果我在分配后立即打印出值,就像这样:
secondVC.guessNumber = _cardNumbers[row];
NSLog(secondVS.guessNumber);
我得到了正确的值。现在我更加困惑了,因为当我实际转到我的第二个 View Controller 时,它似乎正在分配值但没有保存它。
最佳答案
assign
告诉 NSString *
属性 setter 保存指针地址而不是 OC 对象本身。
_cardNumbers[row]
和 _cardImages[row]
都返回一个自动释放的对象,该对象将在您完成 didSelectRow
方法后释放,因此您无法在 SecondViewController
的 viewDidLoad
中获取预期的字符串值。
改用 strong
或 copy
,它告诉属性 setter 将值的 retain count
增加 1,所以 SecondViewController
owns (guessNumber
owns) 字符串值,你可以在它的生命周期中一直获取它。
关于ios - 在 ViewController 之间推送数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49182506/