我是一名 Android 开发人员,正在开发我们应用的 iOS 版本。我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为。我需要显示一个新的视图控制器,然后在新的视图控制器关闭时将控制权返回到以前的视图控制器。我当时还需要一个回调方法来触发。
如何在 iOS 中实现这一点?
有几种方法,所以大多数情况下你自己用各种模式来做这件事。您可以在应用程序委托中设置导航控制器,如下所示:
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 和块,这取决于您的操作可能更简单。
如果我们假设您想从您自己的应用程序中打开一个活动,那么这很容易。一个 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.
通常,您可以使用UINavigationController
来封装您的viewControllers
. 然后,您可以在viewControllers
. 对于回调,您可以viewWillDissapear:
在第二个视图控制器上使用委托方法并从那里执行一些操作。