首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three20的TTNavigator和委托模式

Three20的TTNavigator和委托模式
EN

Stack Overflow用户
提问于 2012-04-02 07:35:25
回答 2查看 263关注 0票数 1

我正在和一些人一起做一个项目,他们想使用TTNavigator而不是故事板或老式的UINavigationController推送。对我来说没问题,除了我们应用程序中的一些视图控制器使用委托模式来相互通信。我不确定如何在使用TTNavigator时保留这种模式。有可能吗?

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

例如,我有一个视图控制器,它想要来自用户的图像。为了获得它,它启动了一个新的视图控制器,该控制器带有一个相机UI,允许用户获取图像。通常,我会将第一个视图控制器设置为摄影机视图控制器的代理。当用户选择了图像时,摄影机视图控制器会将选择告知代理,然后代理抓取图像并将摄影机视图控制器从堆栈中弹出。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 00:53:03

这是可能的,但不推荐使用

您可以在"query“中传递数据。当然,您可以传递源viewController,然后将其连接到目标viewController的构造函数中。它是松散耦合的,可以很好地工作。不过,这并不是很漂亮。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-03 23:50:14

具有讽刺意味的是,我在使用facebook-ios-sdk为我的一个three20应用程序添加facebook支持时也遇到了类似的问题。我的控制器希望得到Facebook的url响应,然而,它不可能使用标准的TTNavigator url映射。

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

我最终将控制器设置为app委托的私有参数,并在TTURLMap中使用该参数。

代码语言:javascript
复制
@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支持几乎是不存在的,而且已经失效了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9969310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档