gpt4 book ai didi

ios - 在另一个 View Controller 中更改对象的属性

转载 作者:行者123 更新时间:2023-11-28 07:24:12 24 4
gpt4 key购买 nike

我有一个 UITabBarController(作为初始 View Controller ),它检查设备的连接状态。每次连接状态发生变化时,子 UITableViewController 单元格 (.accessoryType) 中的复选标记应设置 (.checkmark) 或移除 (.none )

标签栏 Controller 中的代码:

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 中的 socket :

@IBOutlet weak var statusOnlineCell: UITableViewCell!

我可以使用 .checkmark.noneUITableViewController 类中更改附件类型。

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

到目前为止一切正常!

但是,当我尝试从 UITabBar 访问 UITableView.statusOnlineCell 时,我得到了 nil。因此,我无法在 UITableViewController 之外更改其属性。

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

  1. 全局变量,反射(reflect)在线状态。我可以使用 UITableView.viewDidAppear() 方法来更改 statusOnlineCell 配件类型。这有效,但前提是未显示 UITableView(仅当显示 UITableView 以外的其他内容时)。如果显示 UITableView 并且我更改了连接状态,则不会重新加载 View 并且我没有找到任何方法来实现此目的。这可能吗?

  2. 找到从 UITabBarController 更改 UITableView.statusOnlineCell 的附件类型的可能性。访问 outlook 返回零。这是为什么?最重要的是,在附件类型发生变化后,我需要重新加载 View (对于 UITableView 在更改连接状态时处于事件状态的情况)。

  3. 是否有任何类型的(我不知道的)方法在对象的属性更改时触发(à la needReload())?我相信这太好了,难以置信。

总结 - 我需要代码来根据连接状态更改表格 View 单元格的附件类型,即使此表格 View 可见。

我阅读了一些教程和 stackexchange 文章,谷歌,......但没有人完成这项工作。

这是我的最佳候选人,但我无法将这些示例应用到我的情况中。 https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/#back-delegation

我不想使用通知,因为不太合适。

任何提示就足够了。提前致谢。

----- 编辑(UTC 时间 14:52)-----(@vadian 要求)

我在 UITabBarController 中添加了(测试)代码。 cell 的结果显示 nil。所以我无法直接从 UITabBarController 访问 UITableView 中的单元格。

UITableView 还没有任何相关代码,因为我直接从 UITabBarController 访问属性 statusOnlineCell 以更改其附件类型.

这种方法是选项 2。(在我上面提到的 3 种可能性中)。

最佳答案

我没有找到解决方案,但找到了解决方法。

为什么没有解决方案:如果从另一个类调用,cell 对象总是nil。因此没有机会将其属性更改为 .checkmark.none。这基本上是我的关键问题,我不知道。

解决方法:代理!我将持有单元格的类声明为连接状态更改的委托(delegate)。这样,无论页面是否在 View 中,复选标记都会被设置或从单元格中删除。

这在应用程序启动时运行(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)
}
}
}

按预期完美运行。

关于ios - 在另一个 View Controller 中更改对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57059577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com