toSharedViewController не повторно использовать существующий контроллер - PullRequest
8 голосов
/ 12 февраля 2012

Моя карта URL выглядит следующим образом:

[map from:@"tt://webPage/(initWithPage:)" toSharedViewController:[WebPageController class]];

и в WebPageController

- (id) initWithPage:(WebPage)page
{
    if (self = [super init])
    {
    ...

Затем я несколько раз вызывал URL в своем коде

tt://webPage/1
tt://webPage/2
tt://webPage/1 (still called the initWithPage: everytime, not cached)

Почему он не кэшируется, поскольку это SharedViewController?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Я полагаю, что это происходит с вами, потому что TTNaviagtor не работает на iOS 5. см. https://github.com/facebook/three20/pull/719/files. Вы пытались запустить тот же код на iOS 4 с тем же результатом?

MyРекомендуется прекратить использование TTNaviagtor.Вы все еще можете использовать библиотеку three20, нажав и вставив TTViewController в собственный метод ios.

Вот пример замены TTNaviagtor в делегате приложения:

@interface AppDelegate : NSObject <UIApplicationDelegate> {

 UIWindow* _window;
 TTBaseNavigationController* _masterNavController;
 WebPageController* _web1Controller;
 WebPageController* _web2Controller;
}

@property(nonatomic, retain) UIWindow* window;
@property(nonatomic, retain) TTBaseNavigationController* masterNavController;
@property(nonatomic, retain) WebPageController* web1Controller;
@property(nonatomic, retain) WebPageController* web2Controller;

И

///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
@implementation AppDelegate

@synthesize window = _window;

@synthesize masterNavController = _masterNavController;
@synthesize web1Controller = _web1Controller;
@synthesize web2Controller = web2Controller;

///////////////////////////////////////////////////////////////////////////////////////////////////
- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  _window = [[UIWindow alloc] initWithFrame:TTScreenBounds()];


    TTViewController* controller = [[[MasterViewController alloc] init] autorelease];
    _masterNavController = [[TTBaseNavigationController alloc] initWithRootViewController:controller];
    [_window addSubview:_masterNavController.view];    
  }

  [_window makeKeyAndVisible];

  return YES;
}

, затем вы можете нажать и вытолкнуть любой TTViewController (или ваши собственные подклассы TTViewController) в _masterNavController.Лично я считаю, что TTNavigator - это плохой шаблон проектирования, и Apple разработала свою навигационную систему в другом стиле.

0 голосов
/ 22 февраля 2012

почему бы не войти в код и проверить, что происходит?

Я считаю, что объекты создаются в TTURLMap's objectForURL:query:pattern:. Вы можете установить точку останова и посмотреть, почему создается новый, вместо того, чтобы повторно использовать старый.

это реализация objectForURL:query:pattern: с моим комментарием

- (id)objectForURL: (NSString*)URL
             query: (NSDictionary*)query
           pattern: (TTURLNavigatorPattern**)outPattern {
  id object = nil;
  if (_objectMappings) {
    // _objectMappings is a NSMutableDictionary and use to cache shared object
    object = [_objectMappings objectForKey:URL]; 
    // if object not found than check does _objectMappings contains it with right key
    if (object && !outPattern) {
      return object;
    }
  }

  NSURL* theURL = [NSURL URLWithString:URL];
  TTURLNavigatorPattern* pattern  = [self matchObjectPattern:theURL];
  if (pattern) {
    if (!object) {
      // object is not found in the mapping dictionary so create new one, this should only happen once for shared object
      object = [pattern createObjectFromURL:theURL query:query]; 
    }
    // make sure navigationMode is TTNavigationModeShare
    if (pattern.navigationMode == TTNavigationModeShare && object) {
       // cache shared object in the mapping dictionary so next time it will re-use the cached one
      [self setObject:object forURL:URL];
      // if setObject:forURL: is not working than the shared object will not be cached
    }
    if (outPattern) {
      *outPattern = pattern;
    }
    return object;

  } else {
    return nil;
  }
}
...