在viewDidLoad之前将变量传递给视图控制器

时间:2015-09-17 20:57:28

标签: objective-c uistoryboardsegue

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

我知道我可以通过在源视图控制器input = "<ul><li>a</li><li>b</li></ul>" disable_formatting = Nokogiri::XML::Node::SaveOptions::DEFAULT_HTML ^ Nokogiri::XML::Node::SaveOptions::FORMAT Loofah.fragment(input).to_html(save_with: disable_formatting) # => "<ul><li>a</li><li>b</li></ul>" 中的此控制器上设置变量来实现此目的。这个问题是,首先它实例化控制器,所以它-prepareForSegue:sender:将运行,然后才能在它上面设置任何内容。

我无法完全从代码创建控制器,因为它的用户界面在Storyboard中。 -viewDidLoad:也首先明确调用-instantiateViewControllerWithIdentifier:

我可以使用信号量并将初始化代码添加到我的目标控制器-viewDidLoad中,但这很难看,它必须是一种更优雅的方式来做到这一点而不是做一个每次出现视图时检查。 (我的设置只需要进行一次。)

有没有办法在变量-viewWillAppear运行之前将变量传递给控制器​​?

编辑:只有当我使用-viewDidLoad从代码触发segue时,才会发生这种情况。

2 个答案:

答案 0 :(得分:1)

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

在源代码管理器中:

<div id="header"><h2>Header</h2></div>
<div id="content">
    <p>Lorem Ipsum</p>
    <p>Lorem Ipsum</p>
    <p>Lorem Ipsum</p>
    <p>Lorem Ipsum</p>
    <p>Lorem Ipsum</p>
    <p>Lorem Ipsum</p>
</div>

在目标控制器(TimViewController)中:

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

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

将源控件中的segue(show segue)添加到目标视图控制器。

输出:

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

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

答案 1 :(得分:1)

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

修改

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