我一直对应分配给viewDidLoad
与viewWillAppear
:UIViewController
子类别的任务类型有点不清楚。UIViewController viewDidLoad vs. viewWillAppear:什么是正确的分工?
例如我正在做一个应用程序,我有一个UIViewController
子类访问服务器,获取数据,将其提供给视图,然后显示该视图。 viewDidLoad
与viewWillAppear
做这件事有什么优点和缺点?
我一直对应分配给viewDidLoad
与viewWillAppear
:UIViewController
子类别的任务类型有点不清楚。UIViewController viewDidLoad vs. viewWillAppear:什么是正确的分工?
例如我正在做一个应用程序,我有一个UIViewController
子类访问服务器,获取数据,将其提供给视图,然后显示该视图。 viewDidLoad
与viewWillAppear
做这件事有什么优点和缺点?
viewDidLoad是你必须做一次的事情。 viewWillAppear会在每次出现视图时被调用。你应该做的事情,你只需要做一次viewDidLoad - 就像设置你的UILabel文本。但是,您可能想要在每次用户查看时修改视图的特定部分,例如,每次进入“正在播放”视图时,iPod应用程序都会将歌词滚动回顶端。
但是,当您从服务器加载内容时,还必须考虑延迟。如果你将所有的网络通信打包到viewDidLoad或viewWillAppear中,它们将在用户看到视图之前执行 - 可能导致应用程序短暂冻结。首先向用户显示带有某种活动指示符的未填充视图可能是个好主意。当您完成网络连接时,可能需要一两秒钟(甚至可能会失败 - 谁知道?),您可以使用数据填充视图。各种叽叽喳喳客户都可以看到关于如何做到的好例子。例如,当您在Twitterrific中查看作者详细信息页面时,该视图只会在网络查询完成之前显示“正在加载...”。
最初只与ViewView一起使用ViewDidLoad。在测试失败的Wifi时,通过将设备设置为飞行模式,意识到表没有随着Wifi的返回而刷新。实际上,即使通过在-Info.plist中将背景模式设置为YES按下主页按钮,似乎也无法刷新设备上的tableView。
我的解决办法:
-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
取决于您是否需要加载数据每个您打开视图的时间?或只有一次?
viewDidLoad:
无论处理你需要做一次。
viewWilLAppear:
无论在每次加载页面时需要更改哪些处理。
标签,图标,按钮标题或大多数dataInputedByDeveloper 通常不会改变。 名称,照片,链接,按钮状态,列表(为您的tableViews或collectionView输入数组)或大多数dataInputedByUser 通常做改变。
因此,关于viewWill可能会被重复调用。例如,如果视图控制器视图在被隐藏之后变得可见(我的意思是这里被遮挡,而不是UIView上的隐藏方法),那么该方法会触发吗?在没有调用viewDidLoad之前,什么样的scenerio会被调用? – dugla 2009-10-16 19:40:21
viewDidLoad只在构造视图时被调用 - 例如在视图控制器initFromNibNamed在视图被访问时调用之后。 viewWillAppear在您的视图控制器不在视图中而是在视图中时调用 - 因此,当您按下视图控制器时,将调用viewWillAppear。如果您从那里推入另一个子视图,并且用户返回,则再次调用viewWillAppear。 – 2009-10-16 19:52:59
谢谢肯德尔。是的,一些策略性放置的NSLog让我分类。 viewWillAppear/viewWillDissappear触发视图控制器推/弹出。 – dugla 2009-10-16 20:01:49