我正在实施一个简单的游戏,用户试图猜测随机选择的卡片。他们从双组件选择器(在FirstViewController中)中选择他们的猜测,在下一个屏幕(SecondViewController)中,他们可以检查它们是否正确。我现在卡住了,试图将用户选择的猜测传递给他们可以检查的屏幕。
在SecondViewController.h中,我声明了guess(number和suit)的两个部分的属性,如下所示:
@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);
我得到了正确的价值。现在我更加困惑,因为它似乎是在分配值而不是在我实际进入第二个视图控制器时保存它。
答案 0 :(得分:1)
assign
告诉NSString *
属性设置器保存指针地址而不是OC对象本身。
_cardNumbers[row]
和_cardImages[row]
都会返回一个自动释放的对象,该对象将在完成didSelectRow
方法后释放,因此您无法在{{1}中获得预期的字符串值} viewDidLoad
。
使用SecondViewController
或strong
代替,它告诉属性设置器将值copy
增加1,因此retain count
拥有({{1}拥有)字符串值,你可以一直在它的生命周期中得到它。
答案 1 :(得分:0)
NSString使用的副本是对的。问题是_cardNumbers和_cardImages,让我们看看_cardNumbers中的数据源。