2012-04-01 3 views
1

Storyboards 또는 구식 UINavigationController pushing보다는 TTNavigator를 사용하고자하는 사람들과 함께 프로젝트 작업을하고 있습니다. 우리의 앱에있는 일부보기 컨트롤러가 위임 패턴을 사용하여 서로 통신한다는 점을 제외하고는 저에게 잘 맞았습니다. TTNavigator를 사용하는 동안 그 패턴을 보존하는 방법을 모르겠습니다. 가능한가?Three20 's TTNavigator와 델리게이트 패턴

내 질문을 묻는 또 다른 방법은 : 해당 대상보기 컨트롤러에 새 actionURL 열려면 TTNavigator 알려주는보기 컨트롤러 내에서 대상보기 컨트롤러에 액세스 할 수 있습니까?

예를 들어 사용자로부터 이미지를 원하는보기 컨트롤러가 있습니다. 이 기능을 사용하려면 사용자가 이미지를 가져올 수있는 카메라 UI가있는 새로운보기 컨트롤러를 시작합니다. 일반적으로 첫 번째 뷰 컨트롤러를 카메라 뷰 컨트롤러의 대리자로 설정합니다. 사용자가 이미지를 선택하면 카메라 뷰 컨트롤러가 대리자에게 선택 사항을 알리고 대리인은 이미지를 잡고 카메라 뷰 컨트롤러를 스택에서 팝합니다.

TTNavigator는 내 첫 번째보기 컨트롤러에 카메라보기 컨트롤러와 상호 작용할 기회를주지 않는 것 같습니다. 내가 보는 한 가지 방법은 첫 번째 뷰 컨트롤러가 TTNavigator의 대리자로 설정되도록하는 것입니다. 그러면 TTNavigator에서 밀어 넣을 뷰 컨트롤러를 볼 수 있습니다. 이것이 이것을 처리하는 가장 좋은 방법입니까?

답변

1

이 가능하지만 당신은 "질의"에 데이터를를 전달할 수 있습니다

을하지 않는 것이 좋습니다. 당신은 확실히 당신의 원천 인 viewController를 전달한 다음 대상 viewController의 생성자에서이를 연결합니다. 그 느슨하게 결합하고 잘 작동합니다. 그 꽤, 그래도.

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

다른 방법으로, 당신은의 ViewController 직접 viewControllerForURL를 사용하여 TTNavigator을 형성 검색 할 수 있습니다 : 다음의 ViewController 것을 밀어 넣습니다. 또한 예쁘지 않다.

많은 프로젝트에서 TTNavigator를 사용했지만 마지막 구현은 가치가있는 것보다 훨씬 어려웠다. 우리는 그것을 iPad 프로젝트에서 작동 시키려고 노력했고 도서관과 끊임없이 싸웠습니다. 결론은 iOS 앱이 웹 앱이 아니며 URL을 맞춤 앱 내의 여러 화면 탐색에 매핑하는 보편적 인 전략이 없다는 것입니다.그것은 각 페이지가 무국적이며 구조화 된 시맨틱 아키텍처 (희망에 따라) 내에서 살지만 풍부한 모바일 애플리케이션, 특히 다중 창 iPad 애플리케이션과 함께 웹에 적합한 의미를 갖습니다. 이러한 세부 정보는 URL에 쉽게 인코딩되지 않습니다. 덜 복잡한 탐색 관리 서브 시스템을 구축 한 다음 필요에 따라 명시 적 URL을 매핑하는 것이 좋습니다.

+0

동의. TTStyledText는 여전히 유용하지만 전반적으로 지금부터 Three20을 명확히하려고 노력할 것입니다. – CharlieMezak

0

역설적이게도, 내 320 개의 앱 중 하나에 Facebook 지원을 추가하기 위해 facebook-ios-sdk을 사용하는 것과 비슷한 문제가있었습니다. 내 컨트롤러 페이스 북의 URL을 응답을 얻을 것으로 예상되지만, 표준 TTNavigator URL 매핑을 사용하는 것은 불가능했습니다.

수신 URL을 전달하기 위해 컨트롤러에서 Facebook 개체를 호출하는 방법을 찾아야했습니다. 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 지원은 거의 존재하지 않고 깨졌습니다.