15

我是一名 Android 开发人员,正在开发我们应用的 iOS 版本。我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为。我需要显示一个新的视图控制器,然后在新的视图控制器关闭时将控制权返回到以前的视图控制器。我当时还需要一个回调方法来触发。

如何在 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 ];

就回调而言,一种方法是在项目的某处创建这样的协议:

@protocol AbstractViewControllerDelegate <NSObject>

@required
- (void)abstractViewControllerDone;

@end

然后让每个视图控制器都希望在委托中触发回调,即:

 @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 活动可以由一个视图控制器 ( UIViewController) 来表示。

iOS 和 Android 的架构非常不同。Android 上的活动是独立的,iOS 上的控制器紧密连接在一个应用程序中。您必须决定如何在屏幕上显示控制器(通常使用UINavigationController,或以模态方式使用presentViewController:animated:)并以某种方式将其连接到父控制器以接收结果。委托模式最适合这一点。

如果您想启动在另一个应用程序中定义的活动或启动系统活动(例如拍摄相机照片),您必须使用预定义的控制器之一(例如 UIImagePickerController)。在 iOS 上,您不能像 Android 那样简单地使用来自不同应用程序的控制器。

And I can recommend you another thing - don't write an iOS app with Android design patterns. Think about what is common on iOS and implement the UI that way. Don't just copy Android code.

于 2012-10-22T14:47:37.067 回答
0

通常,您可以使用UINavigationController来封装您的viewControllers. 然后,您可以在viewControllers. 对于回调,您可以viewWillDissapear:在第二个视图控制器上使用委托方法并从那里执行一些操作。

于 2012-10-22T14:37:26.180 回答