web-dev-qa-db-ja.com

デスティネーションビューコントローラーでセグエの送信者を取得する

私はVC名前付きダッシュボード(D)を持っています。これはVC名前付きログイン(L)とa VC名前付き登録(R)。ログインは開くことができますVC登録も。

ストーリーボードはできるだけ頻繁に使用するようにしていますので、DからL、DからR、LからRの3つのセグエを作成しました。

したがって、D-> L-> Rの場合およびD-> Rの場合、Rを閉じるときに、必要に応じてLを閉じ、ユーザー情報のロードを開始できることをDに通知する必要があります(一言で言えば)。

だから、私はそれを次のようなperformSegueWithIdentifierの送信者エントリに入れたことを知って、宛先vcでSegueの送信者を取得したいと思います:

[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self];
11
Thomas Leduc

これを行うには、登録/ログインが完了したときにRに通知を送信させ、Dにそれをリッスンさせてから、すべてをポップしてデータをロードします。

ただし、送信者への参照を取得する必要がある場合は、このプロパティを宛先に追加してVC)、ソースVCのprepareForSegue:sender:に設定できます。

8
Taum

これは、デリゲートを使用するのに最適な場所のように思えます。 RegisterViewController.hで、次のようなプロトコルを定義します

@protocol RegisterViewDelegate <NSObject>
- (void)tellRegisterDelegateSomething:(NSObject*)something;
@end

次に、クラスでデリゲートへのポインタを保持します

@interface RegisterViewController : UIViewController
@property (weak, nonatomic) id <RegisterViewDelegate> delegate;
@end

次に、表示しているView Controllerに、作成したばかりの新しいプロトコルを実装していることを伝えます。これは、このビューを表示する他のビューコントローラの.hファイルで行われます。

LoginViewController.h内

@interface LoginViewController : UIViewController <RegisterViewDelegate>
@end

DashboardViewController.h内

@interface DashboardViewController : UIViewController <RegisterViewDelegate>
@end

上記のクラスの.mファイルで、プロトコルのメソッドを実装します

- (void)tellRegisterDelegateSomething:(NSObject*)something
{
}

ここで、このように表示されているView Controllerからセグエを実行するときに、デリゲートを割り当てる必要があります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"SegueToFbRegister"])
    {
        RegisterViewController* destination = [segue destinationViewController];
        destination.delegate = self;
    }
}

これで、提示しているView Controller(委任)を呼び出して、このように送り返す必要のある情報を処理することができます(これは、RegisterViewController.mで呼び出されます)。

if ([self.delegate respondsToSelector:@selector(tellRegisterDelegateSomething:)])
{
    // Tell the delegate something.
    [self.delegate tellRegisterDelegateSomething:something];
}

2つのコントローラーを通過する必要がある場合は、同じ基本パターンに従います。

@protocol LoginViewDelegate <NSObject>
- (void)tellLoginDelegateSomething:(NSObject*)something;
@end

次に、クラスでデリゲートへのポインタを保持します

@interface LoginViewController : UIViewController
@property (weak, nonatomic) id <LoginViewDelegate> delegate;
@end

次に、ダッシュボードビューコントローラーにプロトコルを実装していることを伝えます。これは、このビューを表示するダッシュボードビューコントローラーの.hファイルで実行されます。

DashboardViewController.h内

@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate>
@end

DashboardViewControllerの.mファイルで、プロトコルのメソッドを実装します

セグエを実行するときは、ビューコントローラでデリゲートを設定する上記のパターンに従います。これで、LoginViewControllerでデリゲートメソッドが呼び出されると、DashboardViewControllerでもデリゲートが呼び出されます。

loginViewController.mで

- (void)tellRegisterDelegateSomething:(NSObject*)something
{
    if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)])
    {
        // Tell the delegate something.
        [self.delegate tellLoginDelegateSomething:something];
    }
}

これですべて接続されたので、両方のコントローラー(または1つだけ)を介してデータを戻し、それを使用して何かを行うことができます。表示されていたビューコントローラに基づいてDashboardViewControllerでさまざまなデリゲートメソッドが呼び出されるため、現在のシナリオがわかります。

お役に立てれば。

8
johnrechd

[〜#〜] r [〜#〜]のデリゲートを作成し、[〜#〜] d [〜#〜][〜# 〜] l [〜#〜]デリゲートメソッドを実装します。prepareForSegue:senderを使用して[〜#〜] r [〜#〜]のデリゲートを割り当てます。終了したら[〜#〜] r [〜#〜]のタスクデリゲートを使用して、必要なアクションを実行します。

0
kaar3k

別の方法は、アンワインドセグエを使用することです。

次のコードをダッシュボード[〜#〜] d [〜#〜])ビューコントローラーに配置します。

@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) {

}

Interface Builderで、Register[〜#〜] r [〜#〜])ビューに対して次の手順を実行しますコントローラ:

  1. 登録完了時に押すボタンを選択してください。
  2. Ctrl + ドラッグビュー上部の終了記号に移動します。
  3. 選択する loadUserInfoAfterRegistrationWithSegue:表示されたリストから。

このアプローチを使用すると、Register[〜#〜] r [〜#〜])ビューコントローラーは常に次の場所に移動しますダッシュボード[〜#〜] d [〜#〜])ビューコントローラー(間にあるものに関係なく)。それらの間のビューコントローラに触れる必要はありません。 ダッシュボード[〜#〜] d [〜#〜])ビューコントローラーでのユーザーデータの読み込み上記で宣言したメソッドでもカスタマイズできます。