【问题标题】:ViewController's private data set to nil after returning from segue从 segue 返回后 ViewController 的私有数据设置为 nil
【发布时间】:2014-11-16 16:07:51
【问题描述】:

我有两种观点。主视图是 ViewController,下一个是 AddItemViewController。 ViewController 有一个表格视图,其中列出了您在转到 AddItemViewController 时添加的项目。 AddItemViewController 上有一个按钮可以连接到 ViewController。问题是,当返回 ViewController 期望添加一个项目时,ViewController 的私有数据突然设置为 nil。从 segue 返回后,我丢失了数据以及任何与我的对象交互的机会。

这里是设置为零的数据

@property (strong, nonatomic) costEstimator *myCost;
@property NSString *testString;

我做错了什么?

这是我在 AddItemViewController 中的 prepareforsegue 代码

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
ViewController *vC = [segue destinationViewController];
[vC addSomething:_selectedItem withQuantity:[_quantBox.text doubleValue]];
}

非常感谢任何帮助。谢谢:)

【问题讨论】:

  • Segues(除了展开)总是实例化新的控制器!所以,如果你没有使用 unwind,你就不会“返回”,而是创建一个新的 ViewController 实例,
  • 谢谢!那么大多数应用程序中的常见做法是什么?人们从不使用segues吗?为什么没有像 segues 那样在 iOS 基础教程的前几章中教授 unwinds?
  • 我不知道为什么写教程的人会写他们所做的。 unwind 是一种 segue,它只是一种不同的类型,因此您可以使用它,或者通过弹出(如果您推送)或关闭(如果您已经展示)返回代码。在进行任何 iOS 编程之前,您应该阅读 Apple 的文档。我将从“iOS 视图控制器编程指南”开始。它解释了很多重要的概念。
  • @rdelmar -- 在导航堆栈上下文中是真的吗?当你推送一个新的 ViewController 时,原来的 ViewController 仍然在堆栈中并由父导航控制器拥有——它不会在推送时释放。
  • @AnnaDickinson,我不确定你在问什么。是的,原来的仍在堆栈上,但这与非展开转场将创建该初始控制器的新实例这一事实没有任何关系(因此导航堆栈上将有 3 个控制器) “返回”的转场)。

标签: ios objective-c segue viewcontroller


【解决方案1】:

在这种情况下,您想弹出 AddItemViewController。当您从 ViewController 切换到 AddItemViewController 时,我猜您进行了推送。这样做有效的是将 AddItemViewController 添加到内存堆栈中 ViewController 的顶部。通过从 AddItemViewController 到 ViewController 再次“segue-ing”,您正在添加 AddItemViewController 的另一个 ViewController 实例 ONTOP。这就是为什么您认为您正在丢失您的数据,而实际上您并没有。您只看到了错误的视图控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多