2

iOS 5 でポップオーバーにデータを渡すときに奇妙な動作に気付きました。PopoversviewDidLoadメソッドが呼び出される前prepareForSegueに呼び出されます。

Storyboard では、セグエが のボタンを に接続しますFirstViewControllerPopoverViewControllerこれは、Navigation Controller に埋め込まれています。

テストのために、2 つのメソッドがログに記録されます。

/* 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 5viewDidLoadでは、 のPopoverViewController前に呼び出されprepareForSegueます。

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

これは奇妙で、 で使用できる Popover にデータを渡すのが難しくなります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. prepareForSegue は、宛先 VC の viewDidLoad の前に呼び出されます
  2. viewDidLoad は、すべてのアウトレットがロードされた後にのみ呼び出されます
  3. したがって、ソース VC の prepareForSegue で宛先 VC のアウトレットを参照しようとしないでください。

次に、いずれかの解決策に自然に到達します-viewDidAppearとviewDidLoadを実装するか、宛先VCのプロパティのみを設定するか、そのアウトレットのいずれかに触れます。

prepareForSegue に関して学んだもう 1 つの教訓は、冗長な処理を避けることです。たとえば、既に tableView セルをストーリーボード経由で VC にセグエしている場合、tableView:didSelectRowAtIndexPath と prepareForSegue の両方を処理しようとすると、同様の競合状態に陥る可能性があります。手動セグエを利用するか、didSelectRowAtIndexPath での処理を省略することで、このような事態を回避できます。

于 2013-08-07T16:01:53.360 に答える