2016-05-30 10 views
1

UITabBar内のすべてのView Controllerに分割されたUITableViewを更新したいとします。ビューコントローラ内でボタンが押されたときにテーブルビューの内容を更新することは可能ですか?私はテーブルビューにセグをしたくないだけで、それを更新し続けます。テーブルビューのロジックはArrayで動作するので、外部ビューコントローラクラスからも更新できる必要があります。別のView ControllerのUIボタンからUITableViewを更新する

答えて

1

はい、絶対に - 限り、あなたはのUITableViewへの参照を持っているとして、あなたは、単に呼び出すことができます。

tableView.reloadData() 

EDIT

を申し訳ありませんが、私は質問を誤解しました。上記は複数のView Controllerでも有効ですが、別のView Controllerのビューにアクセスするのは悪い習慣です。たとえば、クラスViewController1とクラス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() 
    } 
} 

希望すると便利です。

EDIT 2

私は実装がUITabBarControllerを希望するものに追加しました:

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() 
    } 

} 
+0

お返事ありがとうございます。すばやく別のクラスからUITableViewへの参照を取得するにはどうすればよいですか? – user3776662

+0

私の編集した回答を参照してください - これは役に立ちますか? – Jason

+0

はい、これは間違いなく役に立ちますが、唯一のことは、最初のView Controllerへの参照を作成しようとするとエラーが発生していることです。 "let vc = ViewController1()" Xcodeは私に叫んで何らかの理由でエラーを投げています。何か案は? – user3776662

2

あなたは別のView Controllerのビューを変更しようとするべきではありません。これはオブジェクト指向プログラミングの重要な原則であるカプセル化の原則に違反します。

他のView Controllerが呼び出せるメソッドを追加する必要があります。

テーブルビューのモデルとして機能する配列が更新されていることを確認し、他のビューコントローラにメッセージを送信して、テーブルビューを更新するように指示します。

テーブルビューを含むビューコントローラは、応答としてテーブルビューにreloadData()を呼び出すだけです。

+0

それは良い点です! – Jason

関連する問題