【问题标题】:Pass variable to view controller before viewDidLoad在 viewDidLoad 之前将变量传递给视图控制器
【发布时间】:2015-12-14 21:14:03
【问题描述】:

我执行故事板中定义的 segue 以打开一个新的视图控制器。我需要在不需要显示某些按钮的特殊状态下配置 segue 的目标视图控制器。

我知道我可以通过在源视图控制器的-prepareForSegue:sender: 中设置此控制器上的变量来做到这一点。这样做的问题是,它首先实例化了控制器,所以 -viewDidLoad: 会运行,然后我才能在上面设置任何东西。

我不能完全用代码创建控制器,因为它的用户界面在 Storyboard 中。 -instantiateViewControllerWithIdentifier: 显然也先调用-viewDidLoad

我可能可以使用信号量并将初始化代码添加到目标控制器的-viewWillAppear 中,但这很丑陋,它必须是一种比每次视图出现时都进行检查更优雅的方法。 (我的设置只需进行一次。)

-viewDidLoad 运行之前,有什么方法可以将变量传递给控制器​​吗?

编辑:看起来只有当我使用 -performSegueWithIdentifier: 从代码中触发 segue 时才会发生这种情况。

【问题讨论】:

  • 为什么不将这些按钮设置为默认隐藏,然后在viewDidLoad中开启或不开启呢?然后,您可以控制显示的内容。
  • 这不会改变任何事情。隐藏或显示它们需要在 viewDidLoad 中进行。
  • 所以你的问题是你不能覆盖viewDidLoad,而不是你要求在调用该方法之前以某种方式传递和执行配置。这对我来说有点不清楚。我的错。
  • 我的问题是,我想使用 viewDidLoad 来设置我的视图(因为它只需要完成一次),我不能这样做,因为我没有值我的变量,我将使用它来设置它(它们将在 viewDidLoad 之后设置)。

标签: objective-c uistoryboardsegue


【解决方案1】:

在我的机器上以及 iOS 8.0 和 iOS 9.0 上,viewDidLoad 在 prepareForSegue 之后调用。因此,以下内容适用于我的答案测试用例。

在您的源控制器中:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    TimViewController * controller = segue.destinationViewController;

    if( [controller isKindOfClass:[TimViewController class]] )
        controller.name = @"tim";
}

在您的目标控制器 (TimViewController) 中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do view setup here.

    NSLog( @"view did load %@", self.name );
}

从源代码控制向目标视图控制器添加一个转场(显示转场)。

输出:

2015-09-17 19:09:04.351 Test[51471:7984717] view did load tim

【讨论】:

  • 也许我误解了这个问题?
  • 好的,我已经为此创建了一个测试项目,你说对了一部分。 -prepareForSegue: 肯定在 -viewDidLoad 之前运行,但前提是故事板调用了 segue。如果您使用-performSegueWithIdentifier: 从代码中触发它,它的工作方式会有所不同。在这里查看我的测试项目:github.com/gklka/SegueTest
【解决方案2】:

我认为这里有些混乱。 -prepareForSegue:sender:-viewDidLoad 被调用之前被调用。请仔细检查您的实施。

编辑:

可能是this thread 将帮助您理解这一点,并且提到的案例之一属于您的案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多