3

ViewAに複数のボタンがあります。ボタンがクリックされると、ViewBにリダイレクトされます。ViewBでは、ユーザーはいくつかの操作を行い、完了したら戻るボタンをクリックします。メソッドを実行し、ViewBからViewAにパラメーターを渡してから、ViewAで作業を続行するにはどうすればよいですか?

戻るボタンを使用することが強く求められていますが、他の方法があるかどうかを知りたいと思っています。

私のアイデアは、スタックからViewAを取得することでした。ViewBを使い終わったら、それを呼び出してリダイレクトするだけですが、その方法がわかりませんでした。

ありがとうございました。

4

5 に答える 5

4

ViewBでデリゲートを定義し、それをViewAに実装するとします。適切なタイミングで(たとえば、戻るボタンがタップされたとき)、ViewBはデリゲートメソッドを呼び出し、値をパラメーターとして渡します。

このようなもの:

ViewB.h

// Define a delegate protocol allowing 
@protocol ViewBDelegate

// Method of delegate called when user taps the 'back' button
-(void) backButtonSelected:(id) object;

@end


@interface ViewB : UIViewController

// property to hold a reference to the delegate
@property (weak)id<ViewBDelegate> delegate;

-(IBAction)backButtonSelected:(id)sender;

@end

ViewB.m:

@implementation ViewB

...

-(IBAction)backButtonSelected:(id)sender{
    NSObject *someObjectOrValue = nil;

    // Invoke the delegates backButtonSelected method, 
    // passing the value/object of interest
    [self.delegate backButtonSelected:someObjectOrValue];
}

@end

ViewA.h:

#import "ViewB.h"


//  The identifier in pointy brackets (e.g., <>) defines the protocol(s)
// ViewA implements
@interface ViewA : UIViewController <ViewBDelegate>

...

-(IBAction)someButtonSelected:(id)sender;

@end

ViewA.m:

-(IBAction)someButtonSelected:id @implementation ViewA

...

// Called when user taps some button on ViewA (assumes it is "hooked up" 
// in the storyboard or IB
-(IBAction)someButtonSelected:(id)sender{

    // Create/get reference to ViewB.  May be an alloc/init, getting from storyboard, etc.
    ViewB *viewB = // ViewB initialization code

    // Set `ViewB`'s delegate property to this instance of `ViewA`
    viewB.delegate = self;
    ...
}

// The delegate method (defined in ViewB.h) this class implements
-(void)backButtonSelected:(id)object{
    // Use the object pass as appropriate
}

@end
于 2012-11-23T19:04:29.810 に答える
2

iOS6では、UnwindSeguesを使用できるようになりました。ストーリーボードでは、これに使用できる新しい終了ボタンに気付いたかもしれません。

Unwind Seguesを使用すると、viewControllerBからviewControllerAに戻り、prepareForSegueメソッドを介して情報を提供できます。

現在、ドキュメントはかなり限られていますが、これを行う方法に関する有用なWWDC2012ビデオがあります(セッション236)

于 2012-11-23T19:31:07.133 に答える
1

プロトコルを実装したくない場合は、他の方法で、次のようにタイプidのプロパティをViewBに作成できます。

@property(nonatomic、unsafe_unretained)id * parentView;

このようにViewBを押すときは、ViewAに設定してください

ViewB.parentView = ViewA; //ViewBをプッシュします

次に、このプロパティを使用してViewAのメソッドを直接呼び出すことができます。

于 2012-11-23T19:10:08.677 に答える
0

ViewControllerAでプロトコルを定義できます(例名はViewControllerADelegate)。ViewControllerBでプロパティデリゲートを作成し、ViewControllerBでViewControllerAで定義されたプロトコルを実装します。

viewControllerBで作業しているときは、ViewControllerADelegateで定義されているviewControllerA呼び出しメソッドへのすべての変更を通知できます。viewControllerBを終了すると、viewControllerAが更新されます。

于 2012-11-23T19:05:46.520 に答える
0

ViewAがViewBを作成している場合は、ViewB.hでプロトコルを作成し、ViewAをViewBのデリゲートとして設定できます。したがって、ViewBで何かを変更するたびに、ViewAに直接通知できます。

モデルに応じて、ViewBで変更した設定を保持するクラスを作成できます。ViewBを作成するときは、通常どおり参照を渡します。これはオブジェクトであるため、インスタンスが共有されるため、ViewAに戻ると、すべての変更がすでに適用されています。

viewB.settings = self.settings; // or whatever model object you have

もう1つのオプションは、カスタムの戻るボタンを作成し(先のとがった外観を失う)、ViewAに通知してから[self.navigationController popViewControllerAnimated:YES]を実行するカスタムメソッドを呼び出すようにすることです。

于 2012-11-23T19:06:22.707 に答える