IOS: как добиться такого поведения, как Android startActivityForResult

Я разработчик Android, работающий на iOS-версии нашего приложения. Мне нужно знать, как добиться поведения, подобного startActivityForResult на Android. Мне нужно показать новый контроллер представления, а затем вернуть управление к предыдущему контроллеру представления, когда новый контроллер просмотра закрыт. Мне также нужен метод обратного вызова, который будет запущен в это время.

Как я могу добиться этого в iOS?

Ответ 1

Есть несколько способов, поэтому в основном вы делаете это самостоятельно с различными шаблонами. Вы можете настроить контроллер навигации в делегате приложения следующим образом:

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

Затем сделайте каждый контроллер вида, для которого вы хотите, чтобы обратный вызов вызывался в делегате 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 и блоков, которые могут быть проще в зависимости от того, что вы делаете.

Ответ 2

Если мы предположим, что вы хотите открыть мероприятие из своего собственного приложения, тогда это легко. Активность андроида может быть представлена ​​контроллером вида (UIViewController).

Архитектуры iOS и Android очень разные. Действия на Android независимы, контроллеры iOS тесно связаны в приложении. Вы должны решить, как показать контроллер на экране (обычно с помощью UINavigationController или представить его с использованием presentViewController:animated:) и связать его с родительским контроллером, чтобы получить результат. Для этого наиболее подходящим является шаблон делегата.

Если вы хотите запустить действие, определенное в другом приложении, или запустить системную активность (например, сделать снимок камеры), вы должны использовать один из предопределенных контроллеров (например, UIImagePickerController). На iOS вы не можете просто использовать контроллеры из разных приложений так же, как Android.

И я могу порекомендовать вам другое дело - не пишите приложение iOS с шаблонами дизайна Android. Подумайте о том, что общего в iOS и реализовать интерфейс таким образом. Не просто скопируйте код Android.

Ответ 3

Как правило, вы можете использовать UINavigationController, чтобы заключить цепочку из viewControllers. Затем вы можете перемещаться вперед и назад между viewControllers. Для обратного вызова вы можете использовать метод делегирования viewWillDissapear: на вашем втором контроллере представления и выполнять некоторые действия оттуда.