簡體   English   中英

在另一個視圖控制器中更改對象的屬性

[英]Change property of object in another view controller

我有一個UITabBarController (作為初始視圖控制器),用於檢查設備的連接狀態。 每次連接狀態更改時,都應該設置( .checkmark )或刪除( .none )子UITableViewController單元格( .accessoryType )中的復選標記。

標簽欄控制器中的代碼:

let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
    let tvc = InfoTableViewController()
    if path.status == .satisfied {
        // set .checkmark in UITableViewController
        let cell = tvc.statusOnlineCell
        print("cell :", cell)
    } else {
        // set .none in UITableViewController
    }
}
let queue = DispatchQueue.global(qos: .background)
monitor.start(queue: queue)

UITableViewController插座:

@IBOutlet weak var statusOnlineCell: UITableViewCell!

我可以使用.checkmark.noneUITableViewController類內部更改附件類型。

statusOnlineCell.accessoryType = .checkmark
statusOnlineCell.accessoryType = .none

到目前為止一切正常!

但是,一旦我嘗試從UITabBar訪問UITableView.statusOnlineCell ,我將得到nil 因此,我無法在UITableViewController之外更改其屬性。

我看到了3種可能的方法:

  1. 全局變量,反映了在線狀態。 我可以使用UITableView.viewDidAppear()方法來更改statusOnlineCell附件類型。 這有效,但是僅當未顯示UITableView時才有效(僅當顯示UITableView以外的其他條件時)。 如果顯示了UITableView並且更改了連接狀態,則不會重新加載該視圖,並且找不到任何方法來實現此目的。 這可能嗎?

  2. 查找從UITabBarController更改UITableView.statusOnlineCell的附件類型的可能性。 訪問前景返回nil。 這是為什么? 最重要的是,在更改附件類型之后,我需要重新加載視圖(對於UITableView在更改連接狀態時處於活動狀態的情況)。

  3. 當對象的屬性改變時(la needReload() ),是否有任何一種(我不知道)會觸發的方法? 我相信,這太好了,難以置信。

總結一下-我需要代碼來更改表格視圖單元格的附件類型,具體取決於連接狀態,即使此表格視圖可見。

我讀了一些教程和stackexchange文章,谷歌,...,但沒有一個完成這項工作。

這是我的最佳人選,但我沒有經理將這些示例應用於我的情況。 https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/#back-delegation

我不想使用通知,因為它不合適。

任何提示就足夠了。 提前致謝。

-----編輯(14:52 UTC)----- (@vadian要求)

我在UITabBarController添加了(測試)代碼。 cell的結果顯示為nil 因此,我無法從UITabBarController直接尋址UITableView的單元格。

UITableView還沒有任何相關代碼,因為我直接從UITabBarController處理了statusOnlineCell以便更改其附件類型。

這種方法是選項2。(在上述3種可能性中)。

我沒有找到解決方案,但是找到了解決方法。

為什么沒有解決方案:如果從另一個類調用該cell對象,則始終為nil 因此,沒有機會將其屬性更改為.checkmark.none 這基本上是我的關鍵問題,對我來說還是未知的。

解決方法:委托! 我聲明了該類(包含單元格)作為連接狀態更改的委托。 這樣,無論頁面是否在視圖中,復選標記都會被設置或從單元中刪除。

該程序在應用程序啟動時運行( UITabBarController ):

protocol StatusOnlineChangedDelegate {
    func updateStatusOnline(_ online: Bool)
}

class TabBarController: UITabBarController {
    var socDelegate: StatusOnlineChangedDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        let monitor = NWPathMonitor()
        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                self.socDelegate?.updateStatusOnline(true)
            } else {
                self.socDelegate?.updateStatusOnline(false)

            }
        }
        let queue = DispatchQueue.global(qos: .background)
        monitor.start(queue: queue)
    }
}

包含單元格的UITableViewController如下所示:

class InfoTableViewController: UITableViewController, StatusOnlineChangedDelegate {
    @IBOutlet weak var statusOnlineCell: UITableViewCell!       
    override func viewDidLoad() {
        super.viewDidLoad()
        TabBarController().socDelegate = self
    }
    func updateStatusOnline(_ online: Bool) {
        DispatchQueue.main.async {
            self.statusOnlineCell.accessoryType = (online ? .checkmark : .none)
        }
    }   
}

根據需要完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM