viewDidLoad vs viewDidAppear - 名称标签问题

时间:2017-01-31 02:04:31

标签: ios swift3 viewdidload viewdidappear

我在显示和更新用户名标签时遇到此问题。

用户ID 1 - 'Felicia'

用户ID 2 - 'Sam'

(第一个屏幕:默认用户是' Felicia') 1st screen: default user is 'Felicia'

(第二个屏幕:将用户更改为' Sam') 2nd screen: when changed user to 'Sam'

(第3个屏幕:点击另一个屏幕后,用户名的标签会自动恢复为' Felicia'当它应该是' Sam') 3rd screen: after clicking to another screen, the username's label auto revert back to 'Felicia' when it supposed to be 'Sam' as user is not changed

我理想的输出是用户名的标签将保留为所选用户,除非用户被更改,并且只要名称更新,也能够反映侧面菜单栏上的名称标签。

在我的代码中,我尝试在viewDidAppear和viewDidLoad中添加我的方法(getUserInfo()和setUserNameLabel()),但两种情况都没有生成我想要的输出。

viewDidAppear

优点: - 名称标签将反映所选用户姓名的更新(用户可以更改其姓名)

缺点: - 选择其他视图时,名称标签将恢复为侧面菜单栏上的用户ID 1名称

viewDidLoad中

优点: - 选择其他视图时,名称标签不会恢复为侧面菜单栏上的用户ID 1的名称

缺点 - 名称标签不会反映所选用户姓名的更新

2 个答案:

答案 0 :(得分:1)

您需要在侧边菜单视图控制器中创建委托或使用NSNotificationCenter进行触发器名称更改事件。

因为在创建侧面菜单时,在此类viewDidLoad或在生命周期中调用一次的任何其他方法。

通过NSNotificationCenter执行此操作的示例。

https://stackoverflow.com/a/24756761/3901620

答案 1 :(得分:0)

解决:viewWillAppearviewWillLayoutsubviews

的内容

我认为viewWillAppearviewWillLayoutsubviews(如果你使用自动布局)就是你需要的。 当您从Felicia切换到Sam时,必须将该状态保存到重新打开侧边菜单时引用的位置。

伪代码:

var selected = Felicia
if `Felicia` clicked:
   selected = Felicia
if `Sam` clicked:
   selected = Sam
(save selected to somewhere like NSUserDefault)

在旁边的菜单viewWillAppear中:使用所选用户更改用户界面。

加载选中(来自某个地方,如NSUserDefault)

if selected == `Felicia` 
  do UI update at main thread
if selected == `Sam`
  do UI update at main thread

看看UIViewController生命周期:

enter image description here