在 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
。但是strong
比assign
要好得多。切勿将 assign
与对象指针一起使用。
【参考方案1】:
assign
告诉NSString *
属性设置器保存指针地址而不是 OC 对象本身。
_cardNumbers[row]
和 _cardImages[row]
都返回一个自动释放的对象,该对象将在完成您的 didSelectRow
方法后释放,因此您无法在 viewDidLoad
的 SecondViewController
中获得预期的字符串值。
使用strong
或copy
代替,它告诉属性设置器将值的retain count
增加1,所以SecondViewController
拥有(guessNumber
拥有)字符串值,你可以在它的整个生命周期。
【讨论】:
感谢您的解释!但是,我现在已经尝试过强效和复制,但我的价值观仍然为空 实现属性setter方法,并在其中设置断点进行调试,找出哪个调用者更新了值。【参考方案2】:NSString 使用的副本是对的。问题是 _cardNumbers 和 _cardImages ,让我们看看 _cardNumbers 中的数据源。
【讨论】:
以上是关于在 ViewController 之间推送数据不起作用的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式从 CollectionView 单元推送 viewController 不起作用 - swift