★ 親から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
*/