使用Xcode 9

时间:2017-09-30 06:40:28

标签: ios swift xcode user-interface uinavigationitem

当我从服务器下载数据模型时,我尝试更新了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()!

但是,如果我已经在设备中有数据并且没有先加载直接读取,那么它的工作完全正常......

2 个答案:

答案 0 :(得分:1)

我认为你可以通过使用本地通知来解决这个问题,

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
}

答案 1 :(得分:1)

嗨,这里是解决这个问题的简要总结,供其他可能面临类似问题的人参考,

@Ian在问题中共享的代码已添加到NavigationController子类中。
这是问题所在。因为你无法从导航控制器更新导航标题和titleView,只需要解释一下这个答案(https://stackoverflow.com/a/20923010/4510873


所以我们尝试从viewController更新titleView,然后它解决了我们的问题。