我正在实现一个简单的游戏,用户尝试猜测随机选择的卡。他们从一个包含两个组件的选择器中(在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方法后被释放,因此您无法在viewDidLoadSecondViewController中获得预期的字符串值。

使用strongcopy代替,它告诉属性设置器将值的retain count增加1,因此SecondViewController拥有(guessNumber拥有)字符串值,您可以在其整个生命周期中获取它时间。

关于ios - 在ViewController之间推送数据不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49182506/

10-10 20:47