2017-03-26 8 views
0

私はAppleのサンプルコードを使用しています。 は、もともとの方法は、私が見るために、本モーダルからセグエ種類を変更し、このSwift 3のunwind(for:UIStoryboardSegue、towardViewController:UIViewController)の使い方

@IBAction func doneTapped() { 
    favoriteCreatureDidChange?(favoriteCreature) 
    dismiss(animated: true, completion: nil) 
} 

(例えばプッシュ)のように見えました。したがって、却下はもはや機能しません。私はPrewuos VCに到達するためにUnwind Segueを使用する必要があります。

私はfavoriteCreatureDidChange?(favoriteCreature)を実行する必要があるので、それはSourceVCでIBActionを宣言する場合ではありません - VCで宣言された変数が、私は現在午前

私は私が私のようunwind(for: UIStoryboardSegue, towardsViewController: UIViewController)

を使用する必要があると思います。 for:パラメータを理解する現在のVCで私をtranferredしたsegueを使う必要があります。

私は

let segue = UIStoryboardSegue(identifier: "showFavoriteCreaturePicker", source: DreamListViewController, destination: FavoriteCreatureListViewController) 

セグエのインスタンスを取得しようとしているが、それはFavoriteCreatureListViewControllerといいすべてだながら、XcodeはCannot convert value of type 'DreamListViewController.Type' to expected argument type 'UIViewController' を文句を言います。

エラーを表示せずに、for:パラメータにセグを渡す方法を教えてください。

答えて

0

この初期化子では、コントローラータイプではなくコントローラインスタンスが必要です。ただし、UIStoryboardSegue documentationからの注:

segueオブジェクトを直接作成しないでください。代わりに、ストーリーボード ランタイムは、2つのビュー コントローラの間でセグを実行する必要があるときにそれらを作成します。必要に応じて UIView Controller のSegue(Identifier:sender:)メソッドを使用してプログラムでセグを開始することもできます。 がプログラムによって追加されたため、Interface ビルダーでは使用できないソースからセグを開始することができます。

また、あなただけのカスタムでは、この初期化子を使用しsegues:

あなたはまたのinitを上書きすることができ 、カスタムセグエサブクラス内の任意の変数を初期化する必要がある場合(識別子:ソース: destination:) メソッドを呼び出して、カスタム実装で初期化します。 unwind(for:​towards​View​Controller:​)については

the documentationは、この(強調鉱山)言う:

アンワインドセグエの実行中に、UIKitは彼らにチャンスを与えるためにアンワインドパスで 任意のビューコントローラにこのメソッドを呼び出します に再設定してください。コンテナビューコントローラはこの メソッドを実装し、後続のVC パラメータでビューコントローラを表示するために使用する必要があります。たとえば、タブバーコントローラは、指定されたビューコントローラを含む タブを選択します。 非コンテナビュー コントローラはこのメソッドをオーバーライドしないでください。

そして、最後に、解決策:あなたは(Interface Builderでアンワインドセグエを作成し、準備上書きすることができます:送信者:)巻き戻しを開始しているあなたのビューコントローラで:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    super.prepare(for: segue, sender: sender) 
    favoriteCreatureDidChange?(favoriteCreature) 
} 

このunwind segueのデスティネーションビューコントローラ内のunwindアクションが呼び出される前に呼び出されます。

pop​View​Controller(animated:​)があることにも注意してください。

+0

解決に感謝します。それはうまくいった。また、Interface Builderでunwind segueを作成できるようにするには、戻したいコントローラにアンワインドメソッド(IBAction)を追加する必要があります。 – Anna

+0

私は2つのボタンを持っているので(完了&キャンセル)。 'override func prepare(segue:UIStoryboardSegue、送信者:Any?){ super.prepare(:segue、送信者:送信者) let button = sender as! UIBarButtonItem button.style場合==の.done { favoriteCreatureDidChange?(favoriteCreature) }} ' はどのようにして' button.style'とUIBarButtonItemに送信者をダウンキャストせずにこれを行うには良い方法があると思いますか? – Anna

+0

私が使用する古典的な方法は、2つのアンワインドアクションを用意し、Interface Builder(例えば "UnwindToDoneSegue"と "UnwindToCancelSegue")の識別子を2つのunwind segues(doneとcancelボタンのそれぞれに1つ) for:sender:) '(' segue.identifier'を使用します)。実際には、後でセグを追加する場合には常に識別子をチェックするという習慣を作りましたが、簡潔にするためにこれを残しました。 – thm