2012-02-12 12 views
8

Mi mapa URL es la siguiente:toSharedViewController no vuelve a utilizar el controlador existente

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

y en el WebPageController

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

Entonces llamé a la url varias veces en mi código

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

¿Por qué no está almacenado en la memoria caché ya que es un SharedViewController?

+0

Lo que se 'WebPage' typedefed a? – tonklon

+0

@tonklon, es solo un ENUM aleatorio – Howard

+0

¿eh? ........... – HelmiB

Respuesta

4

Creo que esto le está sucediendo porque TTNaviagtor está roto en iOS 5. vea https://github.com/facebook/three20/pull/719/files. ¿Has intentado ejecutar el mismo código en un iOS 4 con el mismo resultado?

Mi recomendación para usted es dejar de usar TTNaviagtor. Puede seguir utilizando la biblioteca three20 presionando y pulsando TTViewController en el método ios nativo.

He aquí un ejemplo en la sustitución de la TTNaviagtor en su aplicación delegado:

@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; 

Y

/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
@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; 
} 

entonces usted puede empujar y hacer estallar cualquier TTViewController (o sus propias subclases de TTViewController) en el _masterNavController . Personalmente, creo que TTNavigator es un mal patrón de diseño, y Apple diseñó su sistema de navegación con una mentalidad diferente.

0

¿por qué no entrar en el código y comprobar qué ocurre?

Creo que los objetos se crean en TTURLMap objectForURL:query:pattern: puede establecer un punto de inflexión y ver por qué se crea uno nuevo en su lugar reutilizar el anterior.

la implementación de este objectForURL:query:pattern: con mi comentario

- (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; 
    } 
} 
Cuestiones relacionadas