导航 UI 未使用 Xcode 9 更新
Posted
技术标签:
【中文标题】导航 UI 未使用 Xcode 9 更新【英文标题】:Navigation UI not updating with Xcode 9 【发布时间】:2017-09-30 06:40:27 【问题描述】:从服务器下载完数据模型后,我尝试更新我的 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(array:) 中
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()!
阅读
但是,假设我已经在设备中有数据并直接读取而不先加载,它完全可以正常工作......
【问题讨论】:
你可以尝试在没有 DispatchQueue.main.async 块的情况下执行 setupTitle_ViewWith(array: array) 您好,刚刚试过。没有运气 一个疑问,你为什么在 isReachable 闭包而不是 successHandler 上调用 setupTitle_ViewWith() 函数?我希望你应该在成功下载后更新一次视图,对吗?有什么具体原因吗? 我在 successHandler 上将 dataModel 保存到 Realm 中,然后在 isReachable 闭包上从领域中读取数据... 哦,谢谢,所以调用函数似乎没有问题,好的,那么最后一次尝试你可以尝试使用“DispatchQueue.main.sync”而不是异步。 【参考方案1】:您好,这里是解决此问题的简要摘要,以供可能面临类似问题的其他人参考,
@Ian 在问题中分享的代码已添加到 NavigationController 子类中。 问题是在这里引起的。因为您无法从导航控制器更新导航标题或 titleView 几乎没有解释,请参阅此答案(https://***.com/a/20923010/4510873)
所以我们尝试从 viewController 更新 titleView 并解决了我们的问题。
【讨论】:
@Ian:感谢您尝试我提出的所有问题 :-) 一起解决问题真是太好了。【参考方案2】:我认为你可以通过使用本地通知来解决这个问题,
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
【讨论】:
以上是关于导航 UI 未使用 Xcode 9 更新的主要内容,如果未能解决你的问题,请参考以下文章