【问题标题】:How to interrupt viewWillAppear hierarchy如何中断 viewWillAppear 层次结构
【发布时间】:2012-10-25 17:58:49
【问题描述】:

我有一个rootViewController,在它的viewDidLoad方法中,我初始化了另外两个ViewController2*对象和它们的视图作为rootViewController.view的子视图,然后我先设置ViewController2* controller.view.hidden = YES

然后,在 v1 上有一个按钮处理程序,当触摸它时,它会呈现一个 UINavigationController,然后在 v1 上触摸“关闭”按钮调用 dismissViewControllerAnimated

问题是:当关闭完成时,ViewController2* 的两个触发viewWillAppear。如何让它只在可见的那个上触发viewWillAppear,而不是在隐藏的那个上?

rootViewController 的实现:

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.v1 = [[ViewController2 alloc] init];
self.v1.title = @"v1";
[self.view addSubview:self.v1.view];
self.v1.view.hidden = YES;

self.v2 = [[ViewController2 alloc] init];
self.v2.title = @"v2";
[self.view addSubview:self.v2.view];

UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"POP" forState:UIControlStateNormal];
[btn sizeToFit];
[btn addTarget:self action:@selector(touchHandler:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:btn];
}

- (void)touchHandler:(id)sender {
UINavigationController * nc= [[UINavigationController alloc] initWithRootViewController:[[UIViewController alloc] initWithNibName:nil bundle:nil]];

((UIViewController *)[nc.viewControllers objectAtIndex:0]).navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"dismiss" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissHandler:)];

[self presentViewController:nc animated:YES completion:nil];
}

- (void) dismissHandler:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end

ViewController2:

@implementation ViewController2
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"%@",self.title);
}

@end

【问题讨论】:

    标签: ios uiviewcontroller viewwillappear


    【解决方案1】:

    viewWillAppear 将在您的 UIViewController 上触发,即使视图控制器视图设置为 hidden=YES。

    如果您想防止发生一些昂贵的操作,您当然可以在您的 viewWillAppear 委托方法中测试 if (self.view.hidden == YES),但请注意,如果您稍后取消隐藏该视图,则 viewWillAppear 获胜那就别开火了。

    【讨论】:

    • 是的,但是这种情况很简单,我可以测试hidden = YES。但是如果我有一个更复杂的场景:rootViewController -> ViewController2 -> ViewController3, ViewController2.view.hidden = YES,当关闭一些模态viewController时,ViewController3的viewWillAppear仍然会触发。我怎样才能防止它发生?
    【解决方案2】:

    很简单,之所以调用这些方法,是因为 viewController 的视图是主窗口视图层次结构的一部分。这意味着它有一个 superview 有一个 superview 有一个 superview 等等,直到这个 superview 是主窗口。 与其隐藏和取消隐藏 viewController 视图,不如在其父视图中添加和删除它们。此外,为了确保在正确的时间正确调用 viewWillAppear 和 viewDidAppear,请查看 ViewController Containment: http://www.cocoanetics.com/2012/04/containing-viewcontrollers/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2021-03-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2011-10-17
      相关资源
      最近更新 更多