问题:开个一个需要登录才能操作,每个界面都需要确认是否登录,并且在切换账号后更新界面
- 定义一个基类,用来检测当前是都登录
class rootView:viewController{
//这个userinfo用static,让所有的子类共用
static var userInfo:UserInfo = UserDefaults.standard.object(forkey:"user") as? UserInfo
func viewDidload(){}
func viewWillAppear{
//在这里检测是否登录,未登录则弹出登录界面
if(notLogin){
//loginview 负责登陆,把登陆完成后的用户信息保存到userdefaults里面。
//像这样 UserDefaults.standard.set(userInfo,forkey:"user")
present loginview
}
}
//该方法用来获取userinfo供子类调用
func getUserInfo()->UserInfo?{
return rootView.userInfo
}
}
- 让其他的
viewController
都继承rootview
class v1:rootView{
func viewDidload(){
//初始化一些东西
let userInfo = self.getUserInfo()
print(userInfo?.name)
.......
}
}
class v2:rootView{
func viewDidload(){
//初始化一些东西
....
}
}
- 这时候会出现一个问题,退出账号换另外一个账号登陆后,之前初始化过的
viewController
并不会重新初始化,显示的还是上一个账号的内容。 - 用观察者模式对
rootView
进行改造
class rootView:viewController{
//这个userinfo用static,让所有的子类共用
static var userInfo:UserInfo = UserDefaults.standard.object(forkey:"user") as? UserInfo
func viewDidload(){
NotificationCenter.default.addObserver(self,
selector: #selector(LoginCheckView.didReceiveReloadNotification),
name: NSNotification.Name(rawValue: "ReloadNotification"), object: nil)
//在通知中心把自己添加成为观察者
}
func viewWillAppear{
//在这里检测是否登录,未登录则弹出登录界面
if(notLogin){ present loginview}
}
//收到通知时执行的方法
func didReceiveReloadNotification(){
NotificationCenter.default.removeObserver(self)
//要先把自己移除,如果当self被release掉后,通知中心会访问一个nil的对象,造成崩溃
self.view = nil //设置为nil后当这个界面重新appear时会重新调用viewDidload()
//登陆成功后重新获取userinfo
rootView.userInfo = UserDefaults.standard.object(forkey:"user") as? UserInfo
}
func getUserInfo()->UserInfo?{
return rootView.userInfo
}
}
- 在登录界面
loginview
的登陆成功方法里添加
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ReloadNotification"), object: nil)
登陆成功就通知所有界面执行didReceiveReloadNotification
方法