iOS:如何实现Android的startActivityForResult等行为

时间:2012-10-22 14:24:13

标签: android iphone ios

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

我如何在iOS中实现这一目标?

3 个答案:

答案 0 :(得分:13)

有几种方法,所以大多数情况下你会自己使用各种模式。您可以在应用程序委托中设置导航控制器,如下所示:

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和块,这可以更简单,具体取决于你做什么。

答案 1 :(得分:1)

如果我们假设您想要从自己的应用程序中打开一个活动,那么这很容易。 Android活动可以由视图控制器(UIViewController)表示。

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

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

我可以向您推荐另一件事 - 不要编写带有Android设计模式的iOS应用程序。想想iOS上的常见内容并以这种方式实现UI。不要只复制Android代码。

答案 2 :(得分:0)

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