我是一名Android开发人员,致力于我们应用的iOS版本。我需要知道如何在Android上实现类似于startActivityForResult的行为。我需要显示一个新的视图控制器,然后在新视图控制器关闭时控制返回到前一个视图控制器。我还需要一个当时触发的回调方法。
我如何在iOS中实现这一目标?
答案 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:
委托方法,并从那里执行某些操作。