【问题标题】:ViewWillAppear of ParentViewController not called未调用 ParentViewController 的 ViewWillAppear
【发布时间】:2012-12-12 09:46:55
【问题描述】:

我正在尝试实现自定义 UIActionSheet(由 ViewController 组成) 我已将视图控制器作为子视图添加到我的 rootView 的导航控制器

- (IBAction)ShowMenu:(id)sender
{
   [self.navigationController.view addSubview:self.menuViewController.view];
   [self.menuViewController setTest:YES];
   [self.menuViewController viewWillAppear:YES];
}

这里的 MenuViewController 有一个 tableview 有几个选项可供选择。选择后,我将打开那些各自的 ViewController。假设我点击 menu1 然后打开 menu1ViewController 并且它工作正常。现在,当我关闭这个 viewController 时,我正在调用dismissViewController。

在 menuViewController 中,我已经编写了代码以通过 menuviewController 设置动画到底部,它工作正常。

但是MenuView的父级是TestViewController,当menuviewController向下动画时,不会调用viewdidAppear函数。

这就是我的问题,

我正在使用此代码通过 menuViewController 设置动画到底部

- (void) slideOut {


  [UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];

    // Set delegate and selector to remove from superview when animation completes
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    // Move this view to bottom of superview
    CGRect frame = self.menusheet.frame;
    frame.origin = CGPointMake(0.0, self.view.bounds.size.height);
    self.menusheet.frame = frame;

    [UIView commitAnimations];
}

// Method called when removeFromSuperviewWithAnimation's animation completes
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
        [self.view removeFromSuperview];
    }
}

菜单视图控制器

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(m_test)
    {
        [self slideIn];
        m_test = FALSE;
    }
    else
    {
        [self slideOut];       
    }

}

【问题讨论】:

  • 请格式化代码以便其他人理解...
  • MenuViewController -viewWillApper:, -viewdidAppear: 代码好吗?
  • 看起来您的 TestViewController 实际上停留在视图层次结构中(即它是可见的),因此不会调用 viewWillAppear。来自文档:viewWillAppear ["通知视图控制器其视图即将添加到视图层次结构中"(developer.apple.com/library/ios/documentation/UIKit/Reference/…)
  • 那么如何解决这个问题
  • 您可以在动画停止时手动调用viewWillAppear,或者从TestViewController的viewWillAppear中提取部分功能到单独的方法中调用。顺便说一句,使用 UIView animateWithDuration:delay:options:animations:completion: 的块动画更方便。

标签: objective-c ios ios5 viewwillappear


【解决方案1】:

恕我直言,-[UIViewController viewWillAppear]-[UIViewController viewDidAppear] 只会在被调用者被那些类似容器的控制器(如导航控制器、标签栏控制器)添加到视图控制器层次结构中时被调用。

如果您只是通过在代码中调用addSubview: 添加视图,则不会调用它。 See also.

在调用 addSubview: 之前和之后,无论是否带有动画,您都可以在代码中以编程方式调用 -viewWillAppear-viewDidAppear

【讨论】:

  • 感谢您的回复,那我应该如何解决这个问题以及我在这里做错了什么
  • @Ranjit 将子视图添加到TestViewController 视图并为其设置动画不会调用TestViewController 的viewWillAppear、viewDidAppear、viewWillDisappear 和viewDidDisappear。您可以手动调用它们(或您希望准备的任何其他方法)。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多