我一直对应该分配给viewDidLoad
vs.的任务类型有点不清楚viewWillAppear
:在UIViewController
子类中。
例如,我正在做一个应用程序,其中我有一个UIViewController
子类访问服务器,获取数据,将其提供给视图,然后显示该视图。viewDidLoad
在vs.中这样做的利弊是什么viewWillAppear
?
我一直对应该分配给viewDidLoad
vs.的任务类型有点不清楚viewWillAppear
:在UIViewController
子类中。
例如,我正在做一个应用程序,其中我有一个UIViewController
子类访问服务器,获取数据,将其提供给视图,然后显示该视图。viewDidLoad
在vs.中这样做的利弊是什么viewWillAppear
?
viewDidLoad 是你必须做一次的事情。每次视图出现时都会调用 viewWillAppear。你应该在 viewDidLoad 中做一些你只需要做一次的事情——比如设置你的 UILabel 文本。但是,您可能希望每次用户查看视图的特定部分时都对其进行修改,例如,每次您进入“正在播放”视图时,iPod 应用程序都会将歌词滚动回顶部。
但是,当您从服务器加载内容时,您还必须考虑延迟。如果您将所有网络通信打包到 viewDidLoad 或 viewWillAppear 中,它们将在用户看到视图之前执行 - 可能导致您的应用程序短暂冻结。首先向用户显示带有某种活动指示器的未填充视图可能是个好主意。当您完成网络时,可能需要一两秒钟(或者甚至可能失败 - 谁知道?),您可以使用您的数据填充视图。在各种 Twitter 客户端中可以看到如何做到这一点的好例子。例如,当您在 Twitterrific 中查看作者详细信息页面时,该视图只会显示“正在加载...”,直到网络查询完成。
需要注意的是,使用 viewDidLoad 进行定位有点冒险,应该避免,因为没有设置边界。这可能会导致意想不到的结果(我有各种各样的问题......)
这篇文章很好地描述了不同的方法以及每种方法中发生的情况。
目前对于一次性初始化和定位,我正在考虑使用带有标志的 viewDidAppear,如果有人有任何其他建议,请告诉我。
最初仅将 ViewDidLoad 与 tableView 一起使用。在失去 Wifi 的情况下进行测试,通过将设备设置为飞行模式,发现表格没有随着 Wifi 的返回而刷新。事实上,似乎没有办法刷新设备上的 tableView,即使在 -Info.plist 中将背景模式设置为 YES 时点击主页按钮也是如此。
我的解决方案:
-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
取决于,您是否需要在每次打开视图时加载数据?还是只有一次?
viewDidLoad:
无论您有什么处理都需要完成一次。
viewWilLAppear:
每次加载页面时需要更改的任何处理。
标签、图标、按钮标题或大多数 dataInputedByDeveloper通常不会更改。名称、照片、链接、按钮状态、列表(tableViews 或 collectionView 的输入数组)或大多数 dataInputedByUser通常会发生变化。