从另一个View Controller中的UI按钮更新UITableView

时间:2016-05-30 03:12:20

标签: ios swift uitableview

我想更新在UITabBar内部的视图控制器之间拆分的UITableView。当在视图控制器内按下按钮时,是否可以更新tableview的内容?我不想进入tableView只是继续更新它。 tableview的逻辑与Array一起工作,所以我需要能够从外部视图控制器类更新它。

2 个答案:

答案 0 :(得分:2)

您不应尝试更改其他视图控制器的视图。这违反了封装原则 - 面向对象编程的一个重要原则。

您应该添加其他视图控制器可以调用的方法。

确保更新用作表视图模型的数组,然后将消息发送到另一个视图控制器,告诉它更新它的表视图。

包含表视图的视图控制器只会在其响应的表视图上调用reloadData()

答案 1 :(得分:1)

是绝对的 - 只要您有对UITableView的引用,您只需调用:

ViewController1

修改

对不起,我误解了这个问题。虽然上述内容对多个视图控制器仍然有效,但Duncan C对于访问另一个视图控制器的视图的不良做法是正确的。例如,假设我有一个班级TableViewController1和一个班级class ViewController1: UIViewController { private var tableView: UITableView! func reloadTableView() { self.tableView.reloadData() } } class ViewController2: UIViewController { func doStuff() { // some reference to instance of first view controller let vc = ViewController1() // Do something that requires table view to be reloaded vc.reloadTableView() } } 。好的做法会有如下内容:

class MyTabBarController: UITabBarController {

    var tableVC: MyTableViewController1?
    var vc2: ViewController2?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableVC = self.storyboard?.instantiateViewControllerWithIdentifier("table vc storyboard id") as? MyTableViewController1
        self.vc2 = self.storyboard?.instantiateViewControllerWithIdentifier("vc2 storyboard id") as? ViewController2

        if let vc1 = self.tableVC,
            let vc2 = self.vc2 {

            self.viewControllers?.append(vc1)
            self.viewControllers?.append(vc2)
        }

    }

}


class MyTableViewController1: UIViewController {

    private var tableView: UITableView!
    private var myArray: [AnyObject]!

    func reloadTableView() {
        self.tableView.reloadData()
    }

    func addToArray(anObject: AnyObject) {
        self.myArray.append(anObject)
   }
}


class ViewController2: UIViewController {

    var vc2: MyTableViewController1?

    func doStuff() {

        // Do something that requires table view to be reloaded
        vc2?.addToArray(someObject)
        vc2?.reloadTableView()
    }

}

希望这有帮助!

编辑2

我已经添加了UITabBarController实现的内容:

HOSTNAME                ARCH         NCPU  LOAD  MEMTOT  MEMUSE  SWAPTO  SWAPUS
-------------------------------------------------------------------------------
global                  -               -     -       -       -       -       -
compute001              lx26-amd64      4     -   31.4G       -     0.0       -
compute002              lx26-amd64      4     -   31.4G       -     0.0       -
compute003              lx26-amd64      4     -   31.4G       -     0.0       -
compute004              lx26-amd64      4     -   31.4G       -     0.0       -
compute005              lx26-amd64      4     -   31.4G       -     0.0       -
compute006              lx26-amd64      4     -   31.4G       -     0.0       -
compute007              lx26-amd64      4     -   31.4G       -     0.0       -
compute008              lx26-amd64      4     -   31.4G       -     0.0       -
compute009              lx26-amd64      4     -   31.4G       -     0.0       -
compute010              lx26-amd64      4     -   31.4G       -     0.0       -
compute011              lx26-amd64      4     -   31.4G       -     0.0