【问题标题】:When is the parent/presenting view controller set on a modal view controller?何时在模态视图控制器上设置父/呈现视图控制器?
【发布时间】:2012-12-03 14:44:20
【问题描述】:

我正在展示一个模态视图控制器。在该模态视图控制器的viewDidLoad 中,我似乎找不到对父 VC 的任何引用......parentViewControllerpresentingViewController 等。如果尚未设置,我应该如何获得引用它?

【问题讨论】:

  • 简而言之,我发现presentingViewController 在第一个视图控制器未嵌入导航控制器时有效(至少在情节提要中),但如果是,您将获得导航控制器.您可以玩游戏来尝试找出逻辑呈现视图控制器,但我认为在呈现视图控制器中设置自己的属性会更好。

标签: iphone objective-c ios views


【解决方案1】:

对于一般解决方案,您可以在第二个控制器中拥有自己的属性,即指向第一个视图控制器的 weak 指针。第一个控制器应该在第一个 segue 的prepareForSegue 中设置第二个控制器的属性。

在回答您的问题时,parentViewController 仅在使用视图控制器包含(您没有这样做)时设置。 presentingViewController 是在您执行 presentViewController 时设置的,但行为会根据第一个视图控制器是否嵌入导航控制器而改变(如果嵌入,则第二个视图控制器的 presentingViewController 是导航控制器,如果不是,它就是您期望的视图控制器)。如果您执行pushViewController,则似乎根本没有设置presentingViewController

底线,如果您在第一个控制器的prepareForSegue 期间设置第二个控制器的自定义属性,我发现它会更加可靠和一致。


所以,在 SecondViewController 中,我有一个 .h @interface,看起来像:

@class FirstViewController;

@interface SecondViewController : UIViewController

@property (nonatomic, weak) FirstViewController *firstViewController;

@end

然后在第一个视图控制器中,我有一个 prepareForSegue,看起来像:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"IdentifierForSegueToSecondControllerHere"])
    {
        SecondViewController *controller = segue.destinationViewController;
        controller.firstViewController = self;
    }
}

显然,如果您使用情节提要,则上述观点适用。如果您使用的是 NIB,您可以执行以下操作:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
controller.firstViewController = self;
[self presentViewController:controller animated:YES completion:nil];

无论如何,一旦您在SecondViewController 中设置了firstViewController 属性,SecondViewController 现在就可以访问属性或调用FirstViewController 的公共方法,例如:

// up at the top, where you have your import statements, include the following

#import "FirstViewController.h"

// then, in the @implementation of the SecondViewController, you can reference
// the first view controller and its properties, such as:

self.firstViewController.someStringProperty = @"some value";

【讨论】:

    【解决方案2】:

    从概念上讲,可以随时加载视图。仅仅因为您的视图已加载并不一定意味着它即将以某种形式显示。

    您可以在UIViewControllerviewWillAppear: 方法中发现您的呈现视图控制器的最早点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多