Articles

Custom UIView subclass from a xib file

Custom views with outlets & actions

So the proper way to load custom views from xib files go like this:

Inside your custom view object, you instantiate the xib file exactly as I told you right up here.Why do? 唯一の違いは、メソッドによって返されるオブジェクト配列を使用する必要がないことです。しかし、ファイルの所有者を参照ポイントとして使用して、インターフェイス ビルダーを介してビュー オブジェクトを接続する必要があり、さらにカスタム コンテナー ビュー アウトレットを使用して、必要なすべてを含むことができます。 🤨

// note: view object is from my previous tutorial, with autoresizing masks disabledclass CustomView: View { // this is going to be our container object @IBOutlet weak var containerView: UIView! // other usual outlets @IBOutlet weak var textLabel: UILabel! override func initialize() { super.initialize() // first: load the view hierarchy to get proper outlets let name = String(describing: type(of: self)) let nib = UINib(nibName: name, bundle: .main) nib.instantiate(withOwner: self, options: nil) // next: append the container to our view self.addSubview(self.containerView) self.containerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate() }}

つまり、ここでの initialize メソッドは、self のオーナーを持つ nib ファイルを読み込んでいるだけです。 読み込みが終わると、アウトレットポインタにxibファイルから適切な値が入力されることになります。 最後にもうひとつだけ、やっておかなければならないことがあります。 xibファイルからのビューは、「プログラム的には」カスタムビューオブジェクトに接続されていますが、視覚的にはそうではありません。 そこで、コンテナビューをビュー階層に追加する必要があります。 🤐

カスタム ビュー オブジェクトを使用したい場合は、ビュー コントローラー内で新しいインスタンスを作成し、最後にサブビューとして自由に追加できます!

bounds, frames aka. それは2つの言葉です。 アンカーについては、素晴らしいチュートリアルがあり、15分ほどで習得できます。 😅

class ViewController: UIViewController { weak var customView: CustomView! override func loadView() { super.loadView() let customView = CustomView() self.view.addSubview(customView) NSLayoutConstraint.activate() self.customView = customView } override func viewDidLoad() { super.viewDidLoad() self.customView.textLabel.text = "Lorem ipsum" }}

以上で、完全に動作するカスタム UIView オブジェクトができ、そのコンテンツを使用するために xib ファイルをロードするようになりました。 そんなに悪くなかったでしょ? 🤪

もう 1 つ追加事項があります。 プログラムでビューを処理するのが好きでない場合や、単にloadViewメソッドをいじくりまわしたくない場合は、それを完全に削除してください。 次に、@IBOutlet キーワードをカスタムビュークラス変数の直前に置きます。 IBを使ってストーリーボードを開き、新しいUIView要素をコントローラにドラッグ&ドロップして、カスタムビューアウトレットを接続します。 これで、魔法のように動作するはずです。 💫

このセクションの見出しでアウトレットとアクションを約束しましたので、IBActions について少し説明します。 これらは、コントローラで期待されるのとまったく同じように動作します。 単純にボタンをカスタムビューにフックして、アクションをカスタムビュークラスに委譲することができます。 タッチや特定のアクションをコントローラに転送したい場合は、デリゲートパターンを使用するか、シンプルなブロックを使用します。 😎