2012-04-01 4 views
1

Ich arbeite an einem Projekt mit Leuten, die TTNavigator statt Storyboards oder altmodischem UINavigationController pushen wollen. Schön von mir, nur einige View-Controller in unserer App verwenden das Delegatenmuster, um miteinander zu kommunizieren. Ich bin mir nicht sicher, wie ich dieses Muster beibehalten kann, während ich TTNavigator verwende. Ist es möglich?Three20's TTNavigator und das Delegatenmuster

Eine andere Möglichkeit, meine Frage zu stellen, ist: ist es möglich, vom View-Controller aus auf den Ziel-View-Controller zuzugreifen, der TTNavigator eine neue actionURL für diesen Ziel-View-Controller öffnet?

Zum Beispiel habe ich einen View-Controller, der ein Bild vom Benutzer will. Um es zu bekommen, startet es einen neuen View-Controller mit einer Kamera-UI, die es dem Benutzer ermöglicht, das Image zu erhalten. Normalerweise würde ich den ersten View-Controller als Delegierten des Kameraansicht-Controllers festlegen. Wenn der Benutzer ein Bild ausgewählt hat, teilt der Kameraansichts-Controller dem Delegierten die Auswahl mit, und der Delegierte nimmt das Bild und hebt den Kameraansicht-Controller vom Stapel auf.

TTNavigator scheint meinem ersten View-Controller keine Chance zu geben, mit dem Kamera-View-Controller zu interagieren. Die eine Art, die ich sehe, ist, dass sich der erste View-Controller als Delegierter des TTNavigators einstellt, was dazu führt, dass der TTNavigator mir einen Blick auf den View-Controller gibt, den er gerade drücken soll. Ist das der beste Weg, damit umzugehen?

Antwort

1

Es ist möglich, aber nicht

empfohlen Sie können Daten in der „Abfrage“ übergeben. Sie können Ihren Ursprung ViewController sicherlich übergeben und dann im Konstruktor des Ziel-ViewController verbinden. Es ist locker gekoppelt und würde gut funktionieren. Es ist aber nicht schön.

http://three20.info/article/2010-10-06-URL-Based-Navigation#nativeparams

Alternativ können Sie die Viewcontroller abrufen direkt die TTNavigator bilden viewControllerForURL mit: und drücken Sie dann die Viewcontroller. Auch nicht schön

Ich habe TTNavigator auf vielen Projekten verwendet, aber die letzte Implementierung war viel mehr Ärger als es wert war. Wir haben versucht, es auf einem iPad-Projekt funktionieren zu lassen und haben ständig mit der Bibliothek gekämpft. Unter dem Strich sind iOS-Apps einfach keine Web-Apps und es gibt keine universelle Strategie für die Zuordnung einer URL zu mehreren Bildschirmnavigation innerhalb einer benutzerdefinierten App.Es macht Sinn für das Web, wo jede Seite staatenlos ist und innerhalb einer strukturierten semantischen Architektur lebt (hoffentlich), aber mit einer reichen mobilen App, insbesondere einer iPad App mit mehreren Fenstern, sind diese Details nicht einfach in einer URL zu codieren. Sie sind besser dran, ein weniger kompliziertes Navigationsmanagement-Subsystem zu erstellen und explizite URLs dann zuzuordnen, wenn Sie sie benötigen.

+0

Einverstanden. TTSstyledText ist immer noch ziemlich nützlich, aber im Großen und Ganzen werde ich versuchen, von jetzt an Three20 aus dem Weg zu gehen. – CharlieMezak

0

Ironischerweise hatte ich ein ähnliches Problem bei der Verwendung der facebook-ios-sdk, um Facebook-Unterstützung zu einem meiner drei20 Apps hinzuzufügen. Mein Controller erwartete, die Facebook-URL-Antwort zu erhalten, jedoch war es nicht möglich, das Standard-TTNavigator URL-Mapping zu verwenden.

Ich musste einen Weg finden, das Facebook-Objekt auf dem Controller zu rufen, um die eingehende URL zu übergeben. Wenn TTNavigator den Controller-Stack für Sie verwaltet, können Sie von keinem anderen als dem Controller selbst auf die Controller zugreifen.

Ich landete Einstellung der Controller hat einen privaten Parameter der App Delegate und mit dem in der TTURLMap.

@class PhotoEditorController; 

@interface PhotoBoothAppDelegate : NSObject <UIApplicationDelegate> { 
    PhotoEditorController* _photoEditorController; 
} 

@property(nonatomic, retain) PhotoEditorController* photoEditorController; 
@end 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
@implementation PhotoBoothAppDelegate 

@synthesize photoEditorController = _photoEditorController; 



/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
#pragma mark - 
#pragma mark UIApplicationDelegate 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:NO]; 

    TTNavigator* navigator = [TTNavigator navigator]; 
    navigator.persistenceMode = TTNavigatorPersistenceModeNone; 

    navigator.window = [[UIWindow alloc] initWithFrame:TTScreenBounds()]; 

    TTURLMap* map = navigator.URLMap; 

    _photoEditorController = [[PhotoEditorController alloc] init]; 

    // Any URL that doesn't match will fall back on this one, and open in the web browser 
    [map from:@"*" toViewController:[TTWebController class]]; 

    [map from:@"tt://photo" toViewController:_photoEditorController transition:UIViewAnimationTransitionCurlUp]; 


    // Before opening the tab bar, we see if the controller history was persisted the last time 
    if (![navigator restoreViewControllers]) { 
     [navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://intro"]]; 
    } 

    return YES; 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    return [[_photoEditorController facebook] handleOpenURL:url]; 
} 

Dieser Code verwendet immer noch die TTNaviagtor Sie jedoch noch Verweise auf die Controller haben, so dass Sie direkt ihre Parameter zugreifen können.

Insgesamt würde ich empfehlen, zu vermeiden TTNavigator. Seine iPad-Unterstützung ist fast nicht vorhanden und kaputt.