2

在 iOS 5 中将数据传递给 popover 时,我注意到一些奇怪的行为。 PopoversviewDidLoad方法在调用之前prepareForSegue调用:

在 Storyboard 中,segue 连接到的按钮FirstViewControllerPopoverViewController该按钮嵌入在导航控制器中。

为了测试,记录了两种方法:

/* FirstViewController.m */
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showPopover"]) {
        NSLog(@"FirstViewController: prepareForSegue");
        UINavigationController *navigationController = segue.destinationViewController;
        PopoverViewController *popoverVC = (PopoverViewController *)navigationController.topViewController;
        popoverVC.myProperty = @"Data to be passed";
    }
}

在另一个 ViewController 中:

/* PopoverViewController.m */
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"PopoverViewController: viewDidLoad");
}

在 iOS 6 下,行为符合预期:

2013-02-25 09:03:53.747 FirstViewController: prepareForSegue
2013-02-25 09:03:53.751 PopoverViewController: viewDidLoad

在 iOS 5viewDidLoadPopoverViewController被调用过prepareForSegue

2013-02-25 09:05:28.723 PopoverViewController: viewDidLoad
2013-02-25 09:05:28.726 FirstViewController: prepareForSegue

这很奇怪,并且很难将数据传递给可用于viewDidLoad. 有什么解决办法吗?

4

3 回答 3

3

我现在使用该viewWillAppear:方法而不是viewDidLoad. 我认为无论如何这是配置视图的更好方法(因为视图可能已经加载并且应该在每次出现时配置视图)。

viewWillAppear:方法prepareForSegue在 iOS 5 和 iOS 6 之后加载。

但是,对于那些需要viewDidLoadtkanzakic 建议的解决方案的人来说,那是可行的。

于 2013-02-25T17:04:52.543 回答
0

为您的属性创建一个自定义设置器并从那里执行您需要的操作,我用这种方式执行此操作:

- (void)setCity:(GLQCity *)city    
{
    if (_city != city) {
        _city = city;

        [self configureView];
    }
}

- (void)configureView
{
    if (self.city) {
        ...
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    ...
    [self configureView];
}
于 2013-02-25T08:22:16.037 回答
0

我对 iOS 5 和 6 之间的区别一无所知,但我过去也遇到过类似的困惑。如果您遵循一般经验法则:

  1. 在目标 VC 的 viewDidLoad 之前调用 prepareForSegue
  2. viewDidLoad 仅在加载所有插座后调用
  3. 因此,不要尝试在源 VC 的 prepareForSegue 中引用任何目标 VC 的出口。

然后,您自然会找到任一解决方案 - 实施 viewDidAppear 与 viewDidLoad,或仅设置目标 VC 的属性与触摸其任何出口。

关于 prepareForSegue 的另一个教训是避免冗余处理。例如,如果您已经通过情节提要将 tableView 单元格连接到 VC,如果您尝试同时处理 tableView:didSelectRowAtIndexPath 和 prepareForSegue,您可能会遇到类似的竞争条件。可以通过使用手动 segue 或放弃在 didSelectRowAtIndexPath 处的任何处理来避免这种情况。

于 2013-08-07T16:01:53.360 回答