7

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

- (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;
}
4

4 回答 4

5

我会这样做 -

- (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
于 2012-12-26T12:31:24.083 回答
4

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

于 2015-05-15T12:45:28.660 回答
0

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

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

于 2013-08-07T17:42:35.443 回答
0

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

于 2015-04-19T17:04:13.520 回答