Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active August 25, 2016 11:23
Show Gist options
  • Save KentarouKanno/b1f66139e1a7aa201b4c84ae723a2d80 to your computer and use it in GitHub Desktop.
Save KentarouKanno/b1f66139e1a7aa201b4c84ae723a2d80 to your computer and use it in GitHub Desktop.
UIContainerView

UIContainerView

★ 親からContainerViewに配置したTableViewControllerのtableViewをリロードする

import UIKit

class ViewController: UIViewController {
    
    var tableViewController: TableViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    @IBAction func containerTableReload(sender: UIButton) {
        tableViewController.dataArray += ["Sample Data"]
        tableViewController.reloadTable()
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if let tableVC = segue.destinationViewController as? TableViewController {
            // TableViewController Instance を保持
            self.tableViewController = tableVC
        }
    }
}

// --------------------------------------

class TableViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.estimatedRowHeight = 20
        tableView.rowHeight = UITableViewAutomaticDimension
    }
    
    func reloadTable()  {
        tableView.reloadData()
    }
    
    // Data Array
    var dataArray = ["Sample Data"]
    
    // MARK: - TableView Delegate & DataSource
    
    // Row Count
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    // Generate Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.numberOfLines = 0
        cell.textLabel?.text = dataArray[indexPath.row]
        return cell
    }
}

★ Containerの子配列から取得したVCのメソッドを呼び出す

import UIKit

// VC1
class ViewController1: UIViewController {

    // BarButtonItem押下時アクション
    @IBAction func pusuNaviItem(sender: UIBarButtonItem) {
        // コンテナからVC2のオブジェクトを取得
        let vc2 = self.childViewControllers[0] as! ViewController2
        // VC2のメソッド呼び出し
        vc2.changeButton(nil)
    }
}

// VC2
class ViewController2: UIViewController {
    // ラベル
    @IBOutlet weak var label: UILabel!

    // ボタン押下アクション(ラベルテキストカラー変更)
    @IBAction func changeButton(sender: UIButton?) {
        label.textColor = UIColor.redColor()
    }
}

★ Containerの子配列からTableViewControllerオブジェクトを取得する場合

import UIKit

class ViewController: UIViewController {
    
    var tableViewController: TableViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Containerの子配列からTableViewControllerオブジェクトを取得
        tableViewController = self.childViewControllers[0] as! TableViewController
    }

    @IBAction func containerTableReload(sender: UIButton) {
        
        tableViewController.dataArray += ["Sample Data"]
        tableViewController.reloadTable()
    }
}

// --------------------------------------

class TableViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.estimatedRowHeight = 20
        tableView.rowHeight = UITableViewAutomaticDimension
    }
    
    func reloadTable()  {
        tableView.reloadData()
    }
    
    // Data Array
    var dataArray = ["Sample Data"]
    
    // MARK: - TableView Delegate & DataSource
    
    // Row Count
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    // Generate Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.numberOfLines = 0
        cell.textLabel?.text = dataArray[indexPath.row]
        return cell
    }
}

★ UIContainerViewをコードで生成、削除する

import UIKit

class ViewController: UIViewController {

    var vc1: ViewController1!
    var vc2: ViewController1!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        vc1 = storyboard?.instantiateViewControllerWithIdentifier("vc1") as! ViewController1
        vc1.view.frame = CGRectMake(50, 100, 200, 300)
        
        vc2 = storyboard?.instantiateViewControllerWithIdentifier("vc2") as! ViewController1
        
    }
    
    // ChildViewControllerを追加する
    func addDisplayChildViewController(vc: UIViewController) {
        
        // 子のwillMoveToParentViewControllerが呼ばれる
        self.addChildViewController(vc)
        
        self.view.addSubview(vc.view)
        
        // 子のdidMoveToParentViewControllerが呼ばれる
        vc1.didMoveToParentViewController(self)
    }
    
    // ChildViewControllerを削除する
    func removeDisplayChildViewController(vc: UIViewController) {
        
        // 子のwillMoveToParentViewControllerが呼ばれる
        vc.willMoveToParentViewController(nil)
        
        vc.view.removeFromSuperview()
        
        // 子のdidMoveToParentViewControllerが呼ばれる
        vc.removeFromParentViewController()
    }
    
    @IBAction func addChildView(sender: UIButton) {
        addDisplayChildViewController(vc1)
        let vc = self.childViewControllers[0] as! ViewController1
        print(vc.label.text)
    }
    
    @IBAction func removeChildView(sender: UIButton) {
        removeDisplayChildViewController(vc1)
    }
    
    @IBAction func changeChildVC(sender: UIButton) {
        transientToViewController(vc1, newVC: vc2)
    }
    
    // ChildViewControllerをアニメーションで入れ替える
    func transientToViewController(oldVC: UIViewController, newVC: UIViewController)  {
        
        let oldVC = self.vc1
        oldVC.willMoveToParentViewController(nil)
        
        self.addChildViewController(newVC)
        self.view.addSubview(newVC.view)
        
        let width = oldVC.view.bounds.size.width
        let height = oldVC.view.bounds.size.height
        vc2.view.frame = CGRectMake(oldVC.view.frame.origin.x , -height ,width,height)
        self.addChildViewController(newVC)
        
        self.transitionFromViewController(oldVC,
            toViewController: newVC,
            duration: 0.25,
            options: [UIViewAnimationOptions.TransitionNone],
            animations: {
                newVC.view.frame = oldVC.view.frame
                self.view.layoutIfNeeded()
            },
            completion: { (success : Bool) in
                
                oldVC.view.removeFromSuperview()
                oldVC.removeFromParentViewController()
                newVC.didMoveToParentViewController(self)
        })
    }
}

// -------------------------------------

class ViewController1: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
    }
    
    override func willMoveToParentViewController(parent: UIViewController?) {
        print("willMoveToParentViewController")
    }
    
    override func didMoveToParentViewController(parent: UIViewController?) {
        print("didMoveToParentViewController")
    }
}

/* 
Life Cycle

viewDidLoad

willMoveToParentViewController

viewWillAppear

didMoveToParentViewController

viewDidAppear

*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment