2010-08-17 2 views
1

Если честно, я не знаю, как это назвать, поэтому я попытаюсь описать это.Возможно ли подклассы UiApplicationDelegate протокола?

Протокол 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

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

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

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

+0

Спасибо за быстрый ответ! Я думаю, что сейчас понимаю правильный подход, но мой случай довольно сложен. Я создал uiviewcontroller с uiwebview. И я хотел общаться между uiwebview и моим приложением через URL-вызовы (возможно, это совершенно неправильно?). Проблема в том, что этот uiviewcontroller довольно глубок в иерархии представлений. Итак, в момент вызова URL, у меня есть несколько просмотров, которые уже выделены. И представление, которое должно обрабатывать URL-вызов, находится поверх экрана. Надеюсь, вы понимаете и можете дать мне более глубокое понимание. – Kacper86

+0

Я предполагаю, что вы находитесь в UINavigationController здесь? Если это так, вы всегда можете использовать '[self.navigationController viewControllers]', чтобы получить массив контроллеров представлений в стеке навигации. Это довольно быстрый способ вникать в иерархию представлений. Затем, предположив, что у вас есть UIWebView, доступный через публичный getter (возможно, как синтезированное свойство?), Вы можете сделать все вызовы, которые вы хотите, прямо из основного AppDelegate. –

+0

Большое спасибо! У меня есть несколько вложенных UINavigationControllers, поэтому я использовал NSNotification (в моем случае это немного проще). Тем не менее, я очень ценю вашу помощь! – Kacper86

1

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

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

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

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

+0

Это хороший подход. Сегодня я впервые экспериментировал с Key-Value Observing, что также довольно легко. Легче, чем копать вокруг иерархии представлений, как я посоветовал выше этого утра! –

+0

Спасибо за ваш ответ! Вы правы, что это простое решение. – Kacper86

+0

Рад, что это сработало. Не забудьте обновить свой ответ. –

Смежные вопросы