Three20的TTNavigator和代表模式

时间:2012-04-01 23:35:25

标签: ios delegates three20 ttnavigator

我正在与一些想要使用TTNavigator而非故事板或老式UINavigationController推送的人一起开展项目。很好,除了我们的应用程序中的一些视图控制器使用委托模式相互通信。我不确定在使用TTNavigator时如何保留该模式。有可能吗?

提出问题的另一种方法是:是否可以从视图控制器中访问目标视图控制器,该控制器告诉TTNavigator打开一个新的actionURL到该目标视图控制器?

例如,我有一个想要来自用户的图像的视图控制器。为了实现它,它启动了一个带有相机UI的新视图控制器,允许用户获取图像。通常,我会将第一个视图控制器设置为摄像机视图控制器的委托。当用户选择了图像时,摄像机视图控制器会告知代表有关选择的内容,代理会抓取图像并将摄像机视图控制器弹出堆栈。

TTNavigator似乎没有给我的第一个视图控制器提供与摄像机视图控制器交互的机会。我看到的一种方法是让第一个视图控制器将自己设置为TTNavigator的委托,这将导致TTNavigator让我看一下它即将推出的视图控制器。这是解决这个问题的最好方法吗?

2 个答案:

答案 0 :(得分:1)

有可能但不推荐

您可以在“查询”中传递数据。你当然可以传递你的原始viewController,然后在目标viewController的构造函数中连接它。它松散耦合,工作得很好。但它并不漂亮。

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

或者,您可以使用viewControllerForURL直接从TTNavigator中检索viewController,然后推送该viewController。也不漂亮

我在许多项目中使用过TTNavigator,但最后一次实施的麻烦远远超过它的价值。我们试图让它在iPad项目上运行,并不断与图书馆进行斗争。底线是iOS应用程序不是Web应用程序,并且没有通用策略将URL映射到自定义应用程序中的多个屏幕导航。对于每个页面都是无状态并且位于结构化语义架构(希望如此)中的Web而言,它非常有意义,但是对于丰富的移动应用程序,尤其是多窗格iPad应用程序,这些细节不容易在网址中编码。您最好构建一个不太复杂的导航管理子系统,然后根据需要映射显式URL。

答案 1 :(得分:0)

具有讽刺意味的是,我在使用facebook-ios-sdk时遇到了类似的问题,以便为我的三个应用程序之一添加facebook支持。我的控制器希望获得Facebook网址响应,但是,无法使用标准TTNavigator网址映射。

我必须找到一种方法来调用控制器上的Facebook对象来传递传入的URL。当TTNavigator为您管理控制器堆栈时,您无法从控制器本身以外的任何其他位置“访问”控制器。

我最终设置控制器具有app委托的私有参数,并在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];
}

此代码仍然使用TTNaviagtor,但是,您仍然可以引用控制器,这意味着您可以直接访问它们的参数。

总的来说,我强烈建议避免TTNavigator。它的iPad支持几乎不存在且破损。