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

Posted

技术标签:

【中文标题】在 ViewController 之间推送数据不起作用【英文标题】:Pushing data between ViewControllers not working 【发布时间】:2018-03-08 21:09:48 【问题描述】:

我正在实现一个简单的游戏,其中用户尝试猜测随机选择的卡片。他们从一个双组件选择器(在 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);

我得到了正确的价值。现在我更加困惑,因为当我实际转到第二个视图控制器时,它似乎是在分配值而不是保存它。

【问题讨论】:

strong 代替assign 代替NSObject(所以NSString @Larme 我将分配更改为强,但它仍然无法正常工作。我确定您是否告诉我将 NSString 更改为 NSObject,但我尝试了两种方法,但仍然为空。 不不,我的意思是@property (nonatomic, strong) NSString * guessNumber;,对对象使用strong(不是分配)。好吧,weak 也是可以接受的,但它的用途不同。 我认为您分配给变量的值为 null ,我尝试了分配,它也打印了该值,但建议让它变得强大 实际上,对于NSString,属性应该是copy,而不是strong。但是strongassign 要好得多。切勿将 assign 与对象指针一起使用。 【参考方案1】:

assign 告诉NSString * 属性设置器保存指针地址而不是 OC 对象本身。

_cardNumbers[row]_cardImages[row] 都返回一个自动释放的对象,该对象将在完成您的 didSelectRow 方法后释放,​​因此您无法在 viewDidLoadSecondViewController 中获得预期的字符串值。

使用strongcopy 代替,它告诉属性设置器将值的retain count 增加1,所以SecondViewController 拥有(guessNumber 拥有)字符串值,你可以在它的整个生命周期。

【讨论】:

感谢您的解释!但是,我现在已经尝试过强效和复制,但我的价值观仍然为空 实现属性setter方法,并在其中设置断点进行调试,找出哪个调用者更新了值。【参考方案2】:

NSString 使用的副本是对的。问题是 _cardNumbers 和 _cardImages ,让我们看看 _cardNumbers 中的数据源。

【讨论】:

以上是关于在 ViewController 之间推送数据不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS推送ViewController不起作用

从侧面菜单推送 ViewController 不起作用

以编程方式从 CollectionView 单元推送 viewController 不起作用 - swift

推送在导航控制器(故事板)中不起作用

在 2 个 ViewController 之间推送 - NavigationBar

如何在新窗口中推送 ViewController