0

ストーリーボード識別子を使用せずにプログラムでView Controllerをインスタンス化する方法はありますか? CNContactPickerController をルート ビュー コントローラーにプッシュしたい。

let controller = CNContactPickerViewController()
controller.delegate = self
navigationController?.present(controller, animated: true, completion: nil)

私はこれを行いましたが、contactPicker (デリゲート) では、特定の連絡先から必要な情報を保存するストーリーボードから VC をプッシュします。問題: 最後のビュー コントローラーをポップすると、CNConctactPickerControllerView に移動したいのですが、最初のビュー コントローラーに移動して却下しようとしましたが、何も起こりません..

4

1 に答える 1

4

これを行う際の問題は、View Controllerの UI が作成されないことです。あなたがしていることは、単にクラスのインスタンスをインスタンス化することです。対応する UI は作成されず、IBOutlets も nil になります。

Interface builder を使用して Nib または Storyboard からインスタンス化するか、すべての UI をコードで手動で作成するかの 2 つのオプションがあります。

CNContactPickerViewController再利用可能にするために、ストーリーボードのインスタンス化を処理する静的メソッドを作成できます。以下を参照してください。

class CBContactPickerViewController: UIViewController {

    static func fromStoryboard() -> CNContactPickerViewController {
        return UIStoryboard(name: "foobar", bundle: nil).instantiateViewController(identifier: "CNContactPickerViewController") as! CNContactPickerViewController
    }
}

これを次のように利用できます。

self.present(viewController: CNContactPickerViewController.fromStoryboard(), animated: true, completion: nil)
于 2016-11-15T10:57:57.857 に答える