[英]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
和.none
從UITableViewController
類內部更改附件類型。
statusOnlineCell.accessoryType = .checkmark
statusOnlineCell.accessoryType = .none
到目前為止一切正常!
但是,一旦我嘗試從UITabBar
訪問UITableView.statusOnlineCell
,我將得到nil
。 因此,我無法在UITableViewController
之外更改其屬性。
我看到了3種可能的方法:
全局變量,反映了在線狀態。 我可以使用UITableView.viewDidAppear()
方法來更改statusOnlineCell
附件類型。 這有效,但是僅當未顯示UITableView
時才有效(僅當顯示UITableView
以外的其他條件時)。 如果顯示了UITableView
並且更改了連接狀態,則不會重新加載該視圖,並且找不到任何方法來實現此目的。 這可能嗎?
查找從UITabBarController
更改UITableView.statusOnlineCell
的附件類型的可能性。 訪問前景返回nil。 這是為什么? 最重要的是,在更改附件類型之后,我需要重新加載視圖(對於UITableView
在更改連接狀態時處於活動狀態的情況)。
當對象的屬性改變時(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.