我有一个UITabBarController
(作为初始视图控制器),它检查设备的连接状态。每次连接状态更改时,都应该设置(.accessoryType
或删除(.checkmark
)子UITableViewController单元格(.none
)中的复选标记
标签栏控制器中的代码:
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
到目前为止一切正常!
但是,一旦我尝试从UITableView.statusOnlineCell
访问UITabBar
,我就会得到nil
。因此,我无法在UITableViewController
之外更改其属性。
我看到了3种可能的方法:
一个全局变量,它反映在线状态。我可以使用UITableView.viewDidAppear()
方法来更改statusOnlineCell
附件类型。这有效,但仅当未显示UITableView
时(仅当显示UITableView
以外的其他字符时)。如果显示UITableView
并且我更改了连接状态,则不会重新加载该视图,也找不到任何方法来实现此目的。这可能吗?
发现可以从UITableView.statusOnlineCell
更改UITabBarController
的附件类型。访问前景返回nil。这是为什么?最重要的是,在更改附件类型之后,我需要重新加载视图(对于UITableView
在更改连接状态时处于活动状态)。
当对象的属性更改(例如{{1})时,是否有任何一种(我不知道)的方法会触发?我相信这真是太好了。
总结-我需要代码来更改表格视图单元格的附件类型,具体取决于连接状态,即使此表格视图可见。
我读了一些教程和stackexchange文章,谷歌,...但是没有一个工作。
这是我的最佳人选,但是我没有经理将这些例子应用于我的情况。 https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/#back-delegation
由于不恰当,我不想使用通知。
任何提示就足够了。预先感谢。
-----编辑(UTC时间14:52)----- (@ vadian要求)
我在needReload()
中添加了(测试)代码。 UITabBarController
的结果显示为cell
。因此,我无法直接访问nil
中UITableView
中的单元格。
UITabBarController
尚无任何相关代码,因为我直接从UITableView
中访问属性statusOnlineCell
来更改其附件类型。
这种方法是选项2。(在我上面提到的3种可能性中)。
答案 0 :(得分:0)
我没有找到解决方案,但是找到了解决方法。
为什么没有解决方案:如果从另一个类调用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)
}
}
}
完美运行。