Можно ли подклассифицировать протокол UiApplicationDelegate? - PullRequest
1 голос
/ 17 августа 2010

Если честно, я не знаю, как это назвать, поэтому постараюсь описать это.

Протокол UIApplicationDelegate имеет метод application: handleOpenURL:. И если я реализую этот метод в своем классе ApplicationDelegate, он будет вызван, когда кто-нибудь откроет мои URL-адреса.

подробности: http://developer.apple.com/iphone/library/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleOpenURL:

Однако я бы хотел, чтобы мой другой класс (uiviewcontroller) получил этот вызов. Чтобы сделать другой пример - вы можете создать несколько классов, и каждый из них может получить позицию GPS. Можно ли сделать то же самое с протоколом UIApplicationDelegate?

Я много раз искал эту тему здесь, но не смог найти ответа, как это сделать. Я знаю, как получить мой делегат приложения ([[UIApplication sharedApplication] делегат]), но в этой ситуации это не так.

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Вы всегда можете отличить кого-то, кто пришел к target-c от какого-либо другого объектно-ориентированного языка, потому что его первым инстинктом является подкласс, подкласс, подкласс.В obj-c не так много подклассов.Конечно, вы МОЖЕТЕ, но дело обстоит не так, как обычно, особенно с такими вещами, как UIApplicationDelegate.Более какао-путь - это использование категорий или иногда создание нового подкласса NSObject, который содержит потенциальный родительский класс в качестве свойства.

В этом случае, конечно, создание подклассов - плохая идея.синглтон UIApplication может иметь только одно свойство делегата.Поэтому, если вы создаете новый UIApplicationDelegate, вам некуда его зацепить.

Вместо этого используйте умный метод вашего одного делегата application:handleOpenURL:, чтобы перехватить URL-вызов и загрузить любой подкласс UIViewController (я знаюЯ знаю: исключения) с этим справится.

1 голос
/ 17 августа 2010

Судя по вашим комментариям к ответу Дэна Рэя, звучит так, будто вы ищете что-то вроде навигация Three20 по URL

1 голос
/ 17 августа 2010

Самое простое решение - использовать NSNotification.Это позволит вам обрабатывать вызов handleOpenURL везде, где вам нужно, без создания ненужной связи между вашим делегатом приложения и классом, который вы хотите обработать.

В вашем делегате приложения обработайте метод делегата и перенаправьте данныепо использованию NSNotificationCenter.

- (void)application:(UIApplication *)application handleOpenURL:(NSURL *)URL
{
  [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationHandleOpenURLNotification" object:self userInfo:[NSDictionary dictionaryWithObject:URL forKey:@"URL"]];
}

Теперь, где бы вам ни пришлось это обработать, просто зарегистрируйтесь в качестве наблюдателя для уведомления и извлеките URL-адрес из информационного словаря пользователя уведомления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...