导航 UI 未更新为 Xcode 9
Navigation UI not updating with Xcode 9
当我从服务器下载完数据模型后,我尝试更新我的 navigationItem titleView。
像这样:
private func loadNews() {
self.newsModelManager.sendRequest(inBackground: false, preSendHandler: { (isReachable) in
if isReachable {
} else {
appDelegate.showInternetFailedAlertView()
}
}, successHandler: { (response) in
print("loadNewsModel: successHandler")
}, errorHandler: { (response) in
print("loadNewsModel: errorHandler")
}, reloginFailHandler: { (response) in
appDelegate.showReloginFailedAlertView()
}) { (isReachable) in
let array = self.newsModelManager.loadFirstFiveNews()!
DispatchQueue.main.async {
self.setupTitle_ViewWith(array: array)
}
}
}
并在 seupTitle_ViewWith(数组:)
func setupTitle_ViewWith(array: [NewsModel]?) {
guard array != nil else { return }
let frame = CGRect(x: 0, y: 0, width: 200, height: 40)
let newsTitle_View = NewsTitleView(newsModelArray: array!, frame: frame)
newsTitle_View.newsTitleViewDelegate = self
self.title_View = newsTitle_View
}
一切正常,直到最后一行 self.title_View = newsTitle_View
我认为这会将我的 titleView 更新为我的 CustomView,
但它不是......
那里可能出了什么问题?
我首先使用领域从服务器保存模型并在 let array = self.newsModelManager.loadFirstFiveNews()!
读取
但是,假设我已经在设备中有数据并直接读取而不先加载,它工作得很好...
我想你可以通过使用本地通知来解决这个问题,
1) 像这样更改您的 loadNews 函数,
private func loadNews() {
self.newsModelManager.sendRequest(inBackground: false, preSendHandler: { (isReachable) in
if isReachable {
} else {
appDelegate.showInternetFailedAlertView()
}
}, successHandler: { (response) in
print("loadNewsModel: successHandler")
}, errorHandler: { (response) in
print("loadNewsModel: errorHandler")
}, reloginFailHandler: { (response) in
appDelegate.showReloginFailedAlertView()
}) { (isReachable) in
let array = self.newsModelManager.loadFirstFiveNews()!
DispatchQueue.main.async {
NSNotificationCenter.defaultCenter().postNotificationName("refresh", object:array)
}
}
}
2) 然后在您的 ViewController 中将其粘贴到 viewDidLoad
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.setupTitle_ViewWith), name: "refresh", object: array)
3)
func setupTitle_ViewWith(notification: NSNotification){
let array = notification.object as! NSArray
guard array != nil else { return }
let frame = CGRect(x: 0, y: 0, width: 200, height: 40)
let newsTitle_View = NewsTitleView(newsModelArray: array!, frame: frame)
newsTitle_View.newsTitleViewDelegate = self
self.title_View = newsTitle_View
}
您好,这是解决此问题的简要总结,供可能面临类似问题的其他人参考,
@Ian在问题中分享的代码已添加到NavigationController子类中。
问题出在这里。因为您无法从导航控制器更新导航标题或 titleView,所以请参阅此答案(https://whosebug.com/a/20923010/4510873)
所以我们尝试从 viewController 更新 titleView 然后它解决了我们的问题。
当我从服务器下载完数据模型后,我尝试更新我的 navigationItem titleView。
像这样:
private func loadNews() {
self.newsModelManager.sendRequest(inBackground: false, preSendHandler: { (isReachable) in
if isReachable {
} else {
appDelegate.showInternetFailedAlertView()
}
}, successHandler: { (response) in
print("loadNewsModel: successHandler")
}, errorHandler: { (response) in
print("loadNewsModel: errorHandler")
}, reloginFailHandler: { (response) in
appDelegate.showReloginFailedAlertView()
}) { (isReachable) in
let array = self.newsModelManager.loadFirstFiveNews()!
DispatchQueue.main.async {
self.setupTitle_ViewWith(array: array)
}
}
}
并在 seupTitle_ViewWith(数组:)
func setupTitle_ViewWith(array: [NewsModel]?) {
guard array != nil else { return }
let frame = CGRect(x: 0, y: 0, width: 200, height: 40)
let newsTitle_View = NewsTitleView(newsModelArray: array!, frame: frame)
newsTitle_View.newsTitleViewDelegate = self
self.title_View = newsTitle_View
}
一切正常,直到最后一行 self.title_View = newsTitle_View
我认为这会将我的 titleView 更新为我的 CustomView, 但它不是...... 那里可能出了什么问题?
我首先使用领域从服务器保存模型并在 let array = self.newsModelManager.loadFirstFiveNews()!
但是,假设我已经在设备中有数据并直接读取而不先加载,它工作得很好...
我想你可以通过使用本地通知来解决这个问题,
1) 像这样更改您的 loadNews 函数,
private func loadNews() {
self.newsModelManager.sendRequest(inBackground: false, preSendHandler: { (isReachable) in
if isReachable {
} else {
appDelegate.showInternetFailedAlertView()
}
}, successHandler: { (response) in
print("loadNewsModel: successHandler")
}, errorHandler: { (response) in
print("loadNewsModel: errorHandler")
}, reloginFailHandler: { (response) in
appDelegate.showReloginFailedAlertView()
}) { (isReachable) in
let array = self.newsModelManager.loadFirstFiveNews()!
DispatchQueue.main.async {
NSNotificationCenter.defaultCenter().postNotificationName("refresh", object:array)
}
}
}
2) 然后在您的 ViewController 中将其粘贴到 viewDidLoad
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.setupTitle_ViewWith), name: "refresh", object: array)
3)
func setupTitle_ViewWith(notification: NSNotification){
let array = notification.object as! NSArray
guard array != nil else { return }
let frame = CGRect(x: 0, y: 0, width: 200, height: 40)
let newsTitle_View = NewsTitleView(newsModelArray: array!, frame: frame)
newsTitle_View.newsTitleViewDelegate = self
self.title_View = newsTitle_View
}
您好,这是解决此问题的简要总结,供可能面临类似问题的其他人参考,
@Ian在问题中分享的代码已添加到NavigationController子类中。
问题出在这里。因为您无法从导航控制器更新导航标题或 titleView,所以请参阅此答案(https://whosebug.com/a/20923010/4510873)
所以我们尝试从 viewController 更新 titleView 然后它解决了我们的问题。