1

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

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

例如,我有一个需要用户提供图像的视图控制器。为了得到它,它启动了一个带有相机 UI 的新视图控制器,允许用户获取图像。通常,我会将第一个视图控制器设置为相机视图控制器的代表。当用户选择了一个图像时,相机视图控制器告诉代理选择,代理抓取图像并将相机视图控制器从堆栈中弹出。

TTNavigator 似乎没有让我的第一个视图控制器有机会与相机视图控制器进行交互。我看到的一种方法是第一个视图控制器将自己设置为 TTNavigator 的委托,这将导致 TTNavigator 让我看到它即将推送的视图控制器。这是处理这个问题的最好方法吗?

4

2 回答 2

1

有可能但不推荐

您可以在“查询”中传递数据。您当然可以传递您的原始视图控制器,然后将其连接到目标视图控制器的构造函数中。它是松散耦合的,可以正常工作。不过,它并不漂亮。

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

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

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

于 2012-05-30T16:53:03.407 回答
0

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

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

我最终将控制器设置为具有应用程序委托的私有参数并在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 支持几乎不存在并且被破坏。

于 2012-04-03T15:50:14.067 回答