代码之家  ›  专栏  ›  技术社区  ›  runmad

在UITableViewController中未调用viewWillAppear?

  •  4
  • runmad  · 技术社区  · 16 年前

    我有几个UITableViewController类,我注意到这些方法没有被调用:

    -(void)viewWillAppear:(BOOL)animated;
    -(void)viewDidAppear:(BOOL)animated;
    

    我读了进去 http://discussions.apple.com/thread.jspa?threadID=1529769&tstart=0 当我按下视图控制器时,我必须自己调用这些方法,但这很奇怪,因为它只适用于UITableViewController。

    7 回复  |  直到 16 年前
        1
  •  6
  •   Huygir    16 年前

    有没有人解决了这个问题,因为原来的帖子是正确的-简单地使用UITableViewController并将该控制器的表视图推到navController上不会触发这些方法,尽管它应该触发。我有一系列的UITableViewControllers和表视图,它们被推送和弹出以显示层次结构的数据-没有什么特别的,但是从来没有调用“viewWill/Did/Appear/enside”方法。只调用viewDidLoad和viewDidUnload。

    我们的两个设置中肯定都有布线问题,但只需将一个视图推入navigationController就可以了(?)——很难相信这会在这么长时间内作为一个基本错误被忽视。

    ?

        2
  •  9
  •   Rob Jones    16 年前

    我在文档中找不到它,但我认为这可能是因为您使用的是UINavigationController。

    设置UINavigationController的委托属性,然后实现UINavigationControllerDelegate怎么样?它提供了两种可选方法:

    – navigationController:willShowViewController:animated: 
    – navigationController:didShowViewController:animated: 
    

    例如,navigationController:willShowViewController:animated:可能如下所示:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
      if ([viewController isKindOfClass:[UITableViewController class]]) {
        [viewController viewWillAppear:animated];
      }
    }
    

    不管怎样,这将使您获得所需的行为,而不必对viewWillAppear进行黑客攻击:遍布您的项目。

        3
  •  0
  •   Hoang Pham    16 年前

    View Controller Programming Guide

    viewWillAppear:和viewDidAppear:方法使子类有机会执行与视图外观相关的任何其他操作。

    你怎么知道这些方法没有被调用?你能不能再提供一些代码,或者至少用NSLog()测试一下,看看是否打印了一些消息。

        4
  •  0
  •   David Carvalho    16 年前

    我也看到了同样的问题。我在IB中有一个简单的UIView,我用一个扩展UITableViewController的类做了一个addSubview。

    在我的应用程序中,我可以看到TableViewController的视图,但在这种情况下不会调用viewWillAppear函数。

        5
  •  0
  •   Scott Persinger    15 年前

    但是,如果您只是在视图控制器内部创建UINavController,那么您需要实现“viewWillAppear”、“viewdidaappear”等等,并将它们转发给导航控制器。

    请注意,如果使用Three20,这一点尤其重要,因为它的视图控制器层次结构要求接收“viewWillAppear”消息。如果不是这样的话,你最终会得到一个TTTableViews,它不会绘制。

        6
  •  0
  •   ferdil    15 年前

    如果使用UITabViewController,也会发生同样的情况。您需要通过实现UITabViewControllerDelegate或UINavigationControllerDelegate回调来强制viewWillAppear调用

        7
  •  0
  •   mpemburn    14 年前

    这种解释可能有助于: http://www.mlsite.net/blog/?p=210

    推荐文章