导航 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 更新的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 9.4 未显示单元测试

从 iOS 11 上的左侧菜单导航后 Xcode 9 导航栏问题不在 iOS 10.3 及更低版本上

iOS15 UI适配之导航条主题: 背景颜色标题颜色

iOS15 UI适配之导航条主题: 背景颜色标题颜色

在 Swift UI/Xcode 中创建导航链接错误

在 Swift xCode 中将 UI 导航栏设置为半透明