TTNavigator и модель делегата от Three20 - PullRequest
1 голос
/ 02 апреля 2012

Я работаю над проектом с некоторыми людьми, которые хотят использовать TTNavigator, а не раскадровки или старомодный толчок UINavigationController. Хорошо, за исключением того, что некоторые контроллеры представления в нашем приложении используют шаблон делегата для связи друг с другом. Я не уверен, как сохранить этот шаблон при использовании TTNavigator. Возможно ли это?

Другой способ задать мой вопрос: возможно ли получить доступ к контроллеру представления назначения из контроллера представления, который говорит TTNavigator открыть новый actionURL для этого контроллера представления назначения?

Например, у меня есть контроллер представления, который хочет изображение от пользователя. Чтобы получить его, он запускает новый контроллер вида с пользовательским интерфейсом камеры, который позволяет пользователю получить изображение. Обычно я бы назначил первый контроллер вида в качестве делегата контроллера вида камеры. Когда пользователь выбрал изображение, контроллер вида камеры сообщает делегату о выборе, и делегат берет изображение и вытаскивает контроллер вида камеры из стека.

TTNavigator, по-видимому, не дает моему первому контроллеру вида возможности взаимодействовать с контроллером вида камеры. Единственный способ, которым я вижу, - первый контроллер представления, который устанавливает себя как делегат TTNavigator, в результате чего TTNavigator дает мне возможность взглянуть на контроллер представления, который он собирается выдвинуть. Это лучший способ справиться с этим?

Ответы [ 2 ]

1 голос
/ 30 мая 2012

Возможно, но не рекомендуется

Вы можете передать data в «запрос». Вы, конечно, могли бы передать свой исходный viewController и затем связать его в конструкторе целевого viewController. Его слабо связаны и будет работать просто отлично. Хотя это не красиво.

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

В качестве альтернативы, вы можете получить viewController непосредственно из TTNavigator, используя viewControllerForURL: и затем нажать этот viewController. Также не очень

Я использовал TTNavigator во многих проектах, но последняя реализация принесла гораздо больше хлопот, чем оно того стоило. Мы пытались заставить его работать над проектом iPad и постоянно боролись с библиотекой. Суть в том, что приложения для iOS просто не являются веб-приложениями, и не существует универсальной стратегии для привязки URL-адреса к многоэкранной навигации в пользовательском приложении. Это имеет смысл для веба, где каждая страница не имеет состояния и живет в структурированной семантической архитектуре (надеюсь), но с богатым мобильным приложением, в частности многопанельным приложением для iPad, эти детали нелегко закодировать в URL. Вам лучше создать менее сложную подсистему управления навигацией и затем отображать явные URL-адреса по мере необходимости

0 голосов
/ 03 апреля 2012

По иронии судьбы, у меня была похожая проблема при использовании facebook-ios-sdk для добавления поддержки facebook в одно из моих трех20 приложений.мой контроллер ожидал получить ответ URL-адреса Facebook, однако было невозможно использовать стандартное отображение URL TTNavigator.

Мне пришлось найти способ вызова объекта Facebook на контроллере для передачи входящего URL-адреса.,когда 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 практически отсутствует и сломана.

...