在另一个视图控制器中更改对象的属性

时间:2019-07-16 14:26:19

标签: ios swift uitableview

我有一个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种可能的方法:

  1. 一个全局变量,它反映在线状态。我可以使用UITableView.viewDidAppear()方法来更改statusOnlineCell附件类型。这有效,但仅当未显示UITableView时(仅当显示UITableView以外的其他字符时)。如果显示UITableView并且我更改了连接状态,则不会重新加载该视图,也找不到任何方法来实现此目的。这可能吗?

  2. 发现可以从UITableView.statusOnlineCell更改UITabBarController的附件类型。访问前景返回nil。这是为什么?最重要的是,在更改附件类型之后,我需要重新加载视图(对于UITableView在更改连接状态时处于活动状态)。

  3. 当对象的属性更改(例如{{1})时,是否有任何一种(我不知道)的方法会触发?我相信这真是太好了。

总结-我需要代码来更改表格视图单元格的附件类型,具体取决于连接状态,即使此表格视图可见。

我读了一些教程和stackexchange文章,谷歌,...但是没有一个工作。

这是我的最佳人选,但是我没有经理将这些例子应用于我的情况。 https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/#back-delegation

由于不恰当,我不想使用通知。

任何提示就足够了。预先感谢。

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

我在needReload()中添加了(测试)代码。 UITabBarController的结果显示为cell。因此,我无法直接访问nilUITableView中的单元格。

UITabBarController尚无任何相关代码,因为我直接从UITableView中访问属性statusOnlineCell来更改其附件类型。

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

1 个答案:

答案 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)
        }
    }   
}

完美运行。