問題:開個一個需要登錄才能操作徒爹,每個界面都需要確認是否登錄彤恶,并且在切換賬號后更新界面
- 定義一個基類双戳,用來檢測當前是都登錄
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供子類調(diào)用
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(){
//初始化一些東西
....
}
}
- 這時候會出現(xiàn)一個問題,退出賬號換另外一個賬號登陸后寡痰,之前初始化過的
viewController
并不會重新初始化抗楔,顯示的還是上一個賬號的內(nèi)容棋凳。 - 用觀察者模式對
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}
}
//收到通知時執(zhí)行的方法
func didReceiveReloadNotification(){
NotificationCenter.default.removeObserver(self)
//要先把自己移除剩岳,如果當self被release掉后贞滨,通知中心會訪問一個nil的對象,造成崩潰
self.view = nil //設置為nil后當這個界面重新appear時會重新調(diào)用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)
登陸成功就通知所有界面執(zhí)行didReceiveReloadNotification
方法