【问题标题】:Navigation UI not updating with Xcode 9导航 UI 未使用 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”而不是异步。

标签: ios swift xcode user-interface uinavigationitem


【解决方案1】:

您好,这里是解决此问题的简要摘要,以供可能面临类似问题的其他人参考,

@Ian 在问题中分享的代码已添加到 NavigationController 子类中。
问题是在这里引起的。因为您无法从导航控制器更新导航标题或 titleView 几乎没有解释,请参阅此答案(https://stackoverflow.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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多