15

I'm an Android developer working on an iOS version of our app. I need to know how to achieve behavior similar to startActivityForResult on Android. I need to show a new view controller, then have control return to the previous view controller when the new view controller is closed. I also need a callback method to be triggered at that time.

How can I achieve this in iOS?

4

3 に答える 3

15

いくつかの方法があるため、ほとんどの場合、さまざまなパターンで自分でこれを行います。次のように、アプリ デリゲートでナビゲーション コントローラーを設定できます。

self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
self.navigationController = [[ UINavigationController alloc ] initWithRootViewController:self.viewController ];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

次に、新しい VC を提示したい場合は、次のようにします。

OtherViewController *ovc = [[ OtherViewController alloc ] initWithNibName:@"OtherViewController" bundle:nil ];
[ self.navigationController pushViewController:ovc animated:YES ];

戻るには、次のようにします。

[ self.navigationController popViewControllerAnimated:YES ];

コールバックに関する限り、これを行う 1 つの方法は、プロジェクトのどこかに次のようなプロトコルを作成することです。

@protocol AbstractViewControllerDelegate <NSObject>

@required
- (void)abstractViewControllerDone;

@end

次に、コールバックをデリゲート aka でトリガーする各ビュー コントローラーを作成します。

 @interface OtherViewController : UIViewController <AbstractViewControllerDelegate>

 @property (nonatomic, assign) id<AbstractViewControllerDelegate> delegate;

 @end

最後に、新しい VC を提示するときに、それをデリゲートとして割り当てます。

  OtherViewController *ovc = [[ OtherViewController alloc ] initWithNibName:@"OtherViewController" bundle:nil ];
  ovc.delegate = self;
  [ self.navigationController pushViewController:ovc animated:YES ];

次に、ovcを閉じるときに、この呼び出しを行います

 [self.delegate abstractViewControllerDone];
 [ self.navigationController popViewControllerAnimated:YES ];

そして、作成したプロトコルに準拠する rootVC では、次のメソッドに入力するだけです。

 -(void) abstractViewControllerDone {

 }

あなたが電話をかけたところです。これには多くのセットアップが必要ですが、他のオプションには NSNotifications とブロックの調査が含まれており、何をしているかによってはより簡単になります。

于 2012-10-22T14:42:15.657 に答える
1

独自のアプリケーションからアクティビティを開きたいと仮定した場合、それは簡単です。Androidのアクティビティは、View Controller(UIViewController)で表すことができます。

iOSとAndroidのアーキテクチャは大きく異なります。Androidでのアクティビティは独立しており、iOSのコントローラーはアプリケーションで緊密に接続されています。コントローラーを画面に表示する方法(通常はを使用するUINavigationControllerか、を使用してモーダルに表示するpresentViewController:animated:)を決定し、結果を受け取るために何らかの方法で親コントローラーに接続する必要があります。これには、デリゲートパターンが最も適しています。

別のアプリケーションで定義されたアクティビティを開始する場合、またはシステムアクティビティを開始する場合(カメラの写真を撮る場合など)は、事前定義されたコントローラーの1つ(UIImagePickerControllerなど)を使用する必要があります。iOSでは、Androidと同じように、異なるアプリケーションのコントローラーを単純に使用することはできません。

また、別のことをお勧めします。Androidのデザインパターンを使用してiOSアプリを作成しないでください。iOSで一般的なことを考え、そのようにUIを実装します。Androidコードをコピーするだけではいけません。

于 2012-10-22T14:47:37.067 に答える
0

UINavigationController通常、 のチェーンを囲むために使用できますviewControllers。その後、 の間を行き来できますviewControllers。コールバックの場合viewWillDissapear:、2 番目のビュー コントローラーでデリゲート メソッドを使用し、そこから何らかのアクションを実行できます。

于 2012-10-22T14:37:26.180 に答える