2012-02-12 1 views
8

다음과 같이 내 URL 맵은 다음과 같습니다toSharedViewController 다시 사용하지 않는 기존 컨트롤러를

[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이므로 캐시되지 않는 이유는 무엇입니까?

+0

objectForURL:query:pattern:의 구현? – tonklon

+0

@tonklon, 그냥 임의의 ENUM입니다 – Howard

+0

응? ........... – HelmiB

답변

4

TTNaviagtor이 iOS 5에서 작동하지 않기 때문에이 문제가 발생했다고 생각합니다. https://github.com/facebook/three20/pull/719/files을 참조하십시오. 동일한 결과를 사용하여 iOS 4에서 동일한 코드를 실행 해 보셨습니까?

내 추천 정보는 TTNaviagtor의 사용을 중지하는 것입니다. 네이티브 ios 메소드에서 TTViewController을 밀고 팝업으로써 three20 라이브러리를 계속 사용할 수 있습니다.

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

은 다음 밀고 _masterNavController에 어떤 TTViewController (또는 TTViewController의 자신의 서브 클래스)를 팝업 할 수 있습니다 여기에

앱 위임에 TTNaviagtor 교체에 대한 예입니다 . 개인적으로, 나는 TTNavigator가 나쁜 디자인 패턴이고, 사과가 다른 사고 방식으로 그들의 네비게이션 시스템을 설계했다고 생각한다.

0

왜 코드를 실행하여 어떤 일이 발생하는지 확인하지 않으시겠습니까?

개체가 TTURLMap의 objectForURL:query:pattern:에서 생성되었다고 생각하면 중단 점을 설정하고 새 점이 생성 된 이유 대신 이전 점을 다시 사용할 수 있습니다.

이`에 typedefed WebPage` 무엇 내 댓글

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