2016-06-22 2 views
4

クラスを作成せずに、またはMainstoryboardを使用して動的にUIViewControllerを作成したいと思います。プログラムで発生させたいのですか? 動的データに応じてUIViewControllerを作成したいと思います。Swiftでuiviewcontrollerを動的に作成する

+1

'let viewController = UIViewController()' =)もっと深い答えを得るために、コードをよく説明してください。 –

+0

ok.Iこれを試してみます –

答えて

13

はい、プログラムで動的にビューを作成できます。私はあなたがクラスを使いたくないと言ったのを知っていますが、本当にする必要があります。しかし、キーは、このクラスにUIをハードコードする必要はなく、ダイナミックに構築することです。

UIViewControllerをサブクラス化できますが、ビューを動的に構築するために必要なデータを渡してから、loadViewメソッドを実装します。 NIBやストーリーボードのシーンは必要ありません。 viewを作成し、動的データに基づいてサブビューを作成してください。これは、従来のView Controller Programming Guideに記載されています。このドキュメントの一部は適用されなくなりました。特に「アンロード」ビューのディスカッションには適用されません。loadViewプロセスについては説明して説明していますが、それでも正常に動作します)。

あなたが見ることができるように、

enter image description here

パスのいずれか(カスタムloadView法)ストーリーボード/ NIBワークフローをバイパス次のようにビューコントローラです。このプロセスを実行する場合は、UIViewオブジェクトをインスタンス化し、ビューコントローラのviewプロパティを設定する必要があります。また、ではなくsuper.loadView()を実装してください。

私はちょうどスウィフト3で、ビューにUILabelオブジェクトの束を追加したい場合たとえば、あなたのような何かを行うことができます:

class DynamicViewController: UIViewController { 

    var strings: [String]! 

    override func loadView() { 
     // super.loadView() // DO NOT CALL SUPER 

     view = UIView() 
     view.backgroundColor = .lightGray 

     let stackView = UIStackView() 
     stackView.translatesAutoresizingMaskIntoConstraints = false 
     stackView.axis = .vertical 
     view.addSubview(stackView) 

     NSLayoutConstraint.activate([ 
      stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor), 
      stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor) 
     ]) 

     for string in strings { 
      let label = UILabel() 
      label.translatesAutoresizingMaskIntoConstraints = false 
      label.text = string 
      stackView.addArrangedSubview(label) 
     } 
    } 
} 

をそして、あなたはそうのようにそれを提示することができます:

@IBAction func didTapButton(_ sender: AnyObject) { 
    let controller = ViewController() 
    controller.strings = ["Hello world", "Foobar", "Baz"] 
    show(controller, sender: sender) 
} 

(スイフト2レンディションは、previous revision of this answerを参照。)


これを言って、NIBやストーリーボードを使わないことになぜ心配しているのか分かりません。ただ空白のものを使用してください。そして、プログラムでコントロールをシーンに動的に追加することもできますが、viewDidLoadで行うことができます。上記とまったく同じ効果が得られますが、かなり古くなったloadView技術を使用したり、viewプロパティをインスタンス化して読み込んだりする必要はありません。

関連する問題