2012-10-22 9 views
11

Ich bin ein Android-Entwickler arbeitet an einer iOS-Version unserer App. Ich muss wissen, wie man ein Verhalten ähnlich wie startActivityForResult auf Android erreicht. Ich muss einen neuen Ansichtscontroller anzeigen und dann die Steuerung zum vorherigen Ansichtscontroller zurückführen, wenn der neue Ansichtscontroller geschlossen wird. Ich brauche auch eine Callback-Methode, die zu diesem Zeitpunkt ausgelöst werden soll.iOS: Wie Verhalten wie Android startActivityForResult

Wie kann ich dies in iOS erreichen?

Antwort

11

Es gibt ein paar Wege, also meist machst du das selbst mit verschiedenen Mustern. Sie können eine Navigationssteuerung im AppDelegate setzen sich wie folgt zusammen:

self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
self.navigationController = [[ UINavigationController alloc ] initWithRootViewController:self.viewController ]; 
self.window.rootViewController = self.navigationController; 
[self.window makeKeyAndVisible]; 

Dann, wenn Sie einen neuen vc präsentieren wollen Sie dies tun können:

OtherViewController *ovc = [[ OtherViewController alloc ] initWithNibName:@"OtherViewController" bundle:nil ]; 
[ self.navigationController pushViewController:ovc animated:YES ]; 

Um wieder dies tun:

[ self.navigationController popViewControllerAnimated:YES ]; 

Soweit ein Rückruf einen Weg, dies ein Protokoll wie diese irgendwo in Ihrem Projekt zu tun, geht zu machen:

@protocol AbstractViewControllerDelegate <NSObject> 

@required 
- (void)abstractViewControllerDone; 

@end 

Dann jeden View-Controller mögen Sie einen Rückruf in einem Delegaten aka ausgelöst werden:

@interface OtherViewController : UIViewController <AbstractViewControllerDelegate> 

@property (nonatomic, assign) id<AbstractViewControllerDelegate> delegate; 

@end 

Schließlich, wenn Sie ein neues vc es als Delegierter zuweisen präsentieren:

OtherViewController *ovc = [[ OtherViewController alloc ] initWithNibName:@"OtherViewController" bundle:nil ]; 
    ovc.delegate = self; 
    [ self.navigationController pushViewController:ovc animated:YES ]; 

dann, wenn Sie ovc entlassen, diesen Anruf

[self.delegate abstractViewControllerDone]; 
[ self.navigationController popViewControllerAnimated:YES ]; 

Und im rootVC, die das Protokoll entsprechen Sie m ade, Sie füllen Sie einfach diese Methode:

-(void) abstractViewControllerDone { 

} 

, dass Sie nur einen Anruf gemacht. Dies erfordert eine Menge von Setup, aber andere Optionen beinhalten NSNotifications und Blöcke, die einfacher sein können, je nachdem, was Sie tun.

+1

Android Rocks, iOS Sucks! (Ich hoffe mein Chef sieht diesen Kommentar nicht XD) Endlich sehe ich etwas, das in Android viel einfacher als iOS zu implementieren ist: D –

+0

Ja, aber jetzt können Sie Blöcke verwenden, die es viel besser machen –

0

Im Allgemeinen können Sie UINavigationController verwenden, um Ihre Kette von viewControllers zu schließen. Sie können dann zwischen viewControllers hin und her navigieren. Für den Rückruf können Sie die Delegate-Methode viewWillDissapear: auf Ihrem zweiten View-Controller verwenden und von dort aus etwas unternehmen.

1

Wenn wir annehmen, dass Sie eine Aktivität aus Ihrer eigenen Anwendung öffnen möchten, dann ist es einfach. Eine Android-Aktivität kann durch einen View-Controller (UIViewController) dargestellt werden.

Die Architekturen von iOS und Android sind sehr unterschiedlich. Die Aktivitäten auf Android sind unabhängig, die Controller auf iOS sind in einer Anwendung eng miteinander verbunden. Sie müssen entscheiden, wie Sie den Controller auf dem Bildschirm zeigen (normalerweise mit einem UINavigationController, oder präsentieren Sie es modal mit presentViewController:animated:) und verbinden Sie es mit dem übergeordneten Controller irgendwie um das Ergebnis zu erhalten. Ein Delegatenmuster ist hierfür am besten geeignet.

Wenn Sie eine in einer anderen Anwendung definierte Aktivität starten oder eine Systemaktivität starten möchten (z. B. um ein Kamerabild aufzunehmen), müssen Sie einen der vordefinierten Controller (z. B. UIImagePickerController) verwenden.Unter iOS können Sie nicht einfach Controller aus anderen Anwendungen wie Android verwenden.

Und ich kann Ihnen eine andere Sache empfehlen - schreiben Sie keine iOS-App mit Android-Design-Muster. Denken Sie darüber nach, was unter iOS üblich ist, und implementieren Sie die Benutzeroberfläche auf diese Weise. Kopieren Sie nicht nur Android-Code.

Verwandte Themen