栃木県のJavaエンジニア、WEBプログラマーのためのサイト

2015.01.28[Swift] カスタムビュー

カスタムビューを作る

テキストフィールド付きボタンを作ってみる
ボタンを押すと入力したテキストをデリゲートで通知する仕様

要点
* XIBファイルを作成(CustomView.xib)
* XIBファイルに対応するカスタムビュークラスを作成(CustomView.swift)
* XIB の File’s Owner -> Custom Class -> Class に CustomView を指定
* カスタムビュークラスで awakeFromNibメソッドをオーバーライドして XIB を読み込む
* プロトコルでデリゲートを定義
* デリゲートはクラスのみに

File’s owner

CustomViewクラスが XIB のオーナーになるように設定する

"File's owner"

クラス

XIB を読み込みサブビューにセットするのとデリゲートの定義
デリゲートを実装出来るのはクラスのみに制限して参照型とし、移譲先は循環参照しないよう弱参照(weak)にする

import UIKit

class CustomView: UIView {
    @IBOutlet weak var textField: UITextField!
    
    /// 移譲先
    weak var delegate: CustomViewDelegate! = nil
    
    override func awakeFromNib() {
        // XIB読み込み
        let view = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as UIView
        addSubview(view)
    }

    @IBAction func buttonTouchUpInside(sender: AnyObject) {
        delegate?.buttonDidTap(textField.text, sender: self)
    }
}

/**
*  デリゲートはクラスのみ
*/
protocol CustomViewDelegate: class {
    func buttonDidTap(text: String, sender: CustomView)
}

カスタムビューを使う

作成したカスタムビューを使ってみる

ストーリーボード

Storyboard に View を貼付けて Custom Class -> Class に CustomView を指定

Main.storyboard

コントローラ

カスタムビューのデリゲートを実装する

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var customView: CustomView!

    override func viewDidLoad() {
        super.viewDidLoad()

        customView.delegate = self
    }

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

extension ViewController: CustomViewDelegate {
    func buttonDidTap(text: String, sender: CustomView) {
        println(text)
    }
}

以上です

この記事について
  • スッキリ (0)
  • 普通 (0)
  • 消化不良 (0)