【问题标题】:segue: destination view controller weirdnesssegue:目标视图控制器的怪异
【发布时间】:2012-06-02 00:40:05
【问题描述】:

在我的应用程序中,我使用了故事板和转场,并且我经常在进行转场之前将数据传递给目标视图控制器,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
        [segue.destinationViewController performSelector:@selector(setMyData:) 
                                          withObject:myData];
    }
} 

它在任何地方都有效,除了在一个地方。选择器被调用,数据被设置,但是当 segue 完成并且目标控制器出现时,它没有我刚刚设置的数据。在源视图控制器和目标视图控制器中打印视图控制器的 id 后,我发现上面代码中的 segue.destinationViewController 是视图控制器的一个不同实例,而不是显示的实例。这是怎么回事?

[更新 1] 我查看了目标视图控制器的生命周期,它首先在 segue 执行期间被加载,但是在我设置属性之后!这意味着,当我在其上调用performSelector 时,视图控制器对象未初始化!这就是我设置的数据不粘的原因。不明白为什么会这样,以及为什么同样的方法适用于我的应用程序的其他部分。

[更新 2] 应要求发布setMyData的代码。一开始我根本没有这个方法,因为locationToOpen是公共财产。我添加它只是为了确保它被调用并打印调试信息。

- (void)setMyData:(MyData *)myData
{
    DLog(@"self: %@", (id)self);
    _myData = myData;
}

【问题讨论】:

  • destinationViewController 是 UINavigationController 吗?
  • @adambinsz:它是一个嵌入在 UINavigationController 中的 UIViewController。 IB 中的 segue 直接进入 UIViewController。
  • 你确定它不会进入导航控制器吗?尝试使用 [[segue.destinationViewController viewControllers] objectAtIndex:0]
  • 你的意思是 [[ ( (UIViewController *)segue.destinationViewController).navigationController viewControllers] objectAtIndex:0] 吗?它返回空值。顺便说一句,我认为甚至不可能继续使用 UINavigationController。执行此操作时出现运行时错误。
  • 是的,可以使用嵌入 UIViewController 的 UINavigationController 进行 segue。我遇到了类似的问题,并用[[[segue destinationViewController] viewControllers] objectAtIndex:0] 替换了segue.destinationViewController,效果很好。

标签: ios ios5 uiviewcontroller uistoryboardsegue


【解决方案1】:

我也有同样的问题。对我来说,我在 prepareForSegue: 代码中设置的目标 ViewController 属性被声明为弱,因为我复制并粘贴了 InterfaceBuilder 自动创建的属性,但我的不是 Storyboard 对象。所以我的财产在从 prepareForSegue: 退出时被 ARC 释放和归零。使它成为一个非弱属性修复它。

【讨论】:

    【解决方案2】:

    我会这样做 -

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    {
        if ([segue.identifier isEqualToString:@"NextSegue"]) 
        {
            DestinationViewController *dest = [segue destinationViewController];
    
            dest.myData = self.myData; 
        }
    }
    

    并且在 DestinationViewController.h 中,您应该创建一个属性 -

    #import <UIKit/UIKit.h>
    
    @interface DestinationViewController : UIViewController
    
    @property (nonatomic, strong) NSObject *myData;
    
    
    @end
    

    另外,确保在 DestinationViewController.m 中合成 myData 属性 -

    @interface DestinationViewController ()
    
    @end
    
    @implementation DestinationViewController
    
    @synthesize myData = _myData;
    
    // other methods here
    
    @end
    

    【讨论】:

    • 谢谢,但这与我在发布的代码中所做的几乎完全相同。
    【解决方案3】:

    我遇到了一个类似的问题,我正在做的 ViewController 在某个奇怪的地方发生了变化, 环顾四周后,似乎 segue 创建了一个新的 ViewController。

    为了解决数据传递问题,我使用了通知。

    【讨论】:

      【解决方案4】:

      我知道这个帖子很旧,应该找到解决方案。但由于最终解决方案未在此处发布,我想列出一个可能的根本原因(这就是我的情况)。我有同样的问题,试图在 segue 的目标视图控制器中设置变量。根本原因是我忘记实例化([[Class alloc]init])对象变量。在我的情况下我需要它,因为我正在设置对象的属性而不是指向其他对象。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多