ios - 在 ViewController 之间推送数据不起作用

标签 ios objective-c oop viewcontroller

我正在实现一个简单的游戏,在该游戏中,用户尝试猜测一张随机选择的纸牌。他们从双组件选择器(在 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 方法后释放,​​因此您无法在 SecondViewControllerviewDidLoad 中获取预期的字符串值。

改用 strongcopy,它告诉属性 setter 将值的 retain count 增加 1,所以 SecondViewController owns (guessNumber owns) 字符串值,你可以在它的生命周期中一直获取它。

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

相关文章:

javascript - UIWebview内容根据webview框架

ios - 是否可以更改具有不同类的对象的类类型?

objective-c - 将 NSString 类别扩展添加到 UIButton

Javascript 面向对象语法

model-view-controller - Coldfusion MVC 中服务包装器 cfc 的命名约定

java - 在java中传递接口(interface)类型(不实现类类型)作为参数

iphone - 为什么executeFetchRequest是:fetchRequest leaking memory?

ios - AutoLayout:无法同时满足约束日志不清楚

ios - xcode 8.x 中缺少 FMDB 库

objective-c - 我们可以在同一个类中使用 swift 和 objective-c 吗