12

Login(L)という名前のVCとRegister(R)という名前のVCを開くことができるDashboard(D)という名前のVCがあります。ログインするとVCレジスタも開くことができます。

絵コンテはできるだけ頻繁に使うようにしていますので、DからL、DからR、LからRの3つのセグエを作成しました。

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

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

[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self];
4

4 に答える 4

8

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

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

于 2013-02-19T18:30:35.313 に答える
8

これは、デリゲートを使用するのに最適な場所のように思えます。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つだけ)を介してデータを戻し、それを使って何かを行うことができます。どのviewcontrollerが表示されたかに基づいて、DashboardViewControllerでさまざまなデリゲートメソッドが呼び出されるため、現在のシナリオがわかります。

お役に立てれば。

于 2013-02-19T18:55:25.367 に答える
0

Rのデリゲートを作成し、DL作成してデリゲートメソッドを実装します。RprepareForSegue:senderのデリゲートを割り当てるために使用します。Rでタスクを終了したら、デリゲートを使用して必要なアクションを実行します。

于 2013-02-19T18:36:58.863 に答える
0

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

次のコードをダッシュ​​ボードD)ビューコントローラーに配置します。

@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) {

}

Interface Builderで、RegisterR) ViewControllerに対して次の手順を実行します。

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

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

于 2017-10-27T10:22:29.763 に答える