iPhone: вызов родительского / супер метода из подпредставления - PullRequest
11 голосов
/ 22 сентября 2010

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

Я пытаюсь сделать что-то вроде книжки с картинками. У меня есть представление, которое является моим контейнером, и я добавляю к нему подпредставления с помощью addubview.

В подпредставлении у меня есть жесты смахивания и т. Д., Которые я хочу активировать в родительском представлении. Я разработал, как вызвать делегата, но я не могу получить делегат для запуска родительского представления. Я прочитал более 10 различных способов сделать это, и ни один из них не работает.

Теперь я очень озадачен тем, что такое супер-вид. Просто чтобы запутать дело, у делегата есть контроллер табуляции, а родительское представление - кнопка табуляции 1

Я пытался

[self.view.superview method]
[self.superview method]

На делегате, которого я пытался self.tabcontroller.parentviewcontroller, выбранный вид, супер вид.super

ОБНОВЛЕНИЕ: Подвид должен быть независимым от родительского представления, так как его можно использовать повторно. Кроме того, я не установил родительское представление на superview, так как я просто думал, что superview - это представление с подпредставлениями (пожалуйста, не убивайте меня). Так что, может быть, мне просто нужно установить родительский вид на супервидение?

Ответы [ 5 ]

23 голосов
/ 22 сентября 2010

Правильный способ сделать это - использовать протокол и шаблон делегата.

Определить протокол, например

@protocol subViewDelegate
   -(void)somethingHappened:(id)sender;
@end

, затем реализовать этот протокол в вашем суперпредставлении:

@interface superView:UIViewController<subViewDelegate> {
...
}
...
@end

определите свойство делегата в вашем SubView, как это

@interface subView : UIView {
   id<subViewDelegate> delegate;
   ...
}
@propery (nonatomic, assign) id<subViewDelegate> delegate;
...
@end

в вашем подпредставлении, вызовите делегат следующим образом

[self.delegate somethingHappened :self];
3 голосов
/ 22 сентября 2010

Немного сложно помочь без кода, но давайте попробуем:

  1. Создайте протокол: назовите его как хотите (я назову его «MyProtocol») и добавьте к нему определение функции, которую вы хотите вызвать в своем суперпредставлении, давайте назовем его «responseToSwipe»
  2. Если вашим суперпредставлением является UIView, вы должны создать свой собственный подкласс UIView и сделать свое суперпредставление экземпляром этого класса.
  3. Пусть ваш (вновь) созданный класс superview реализует протокол 1.) и реализует метод responseToSwipe
  4. Создайте переменную экземпляра идентификатора типа в вашем подпредставлении и назовите его так, как вам нравится, например, "MyDelegate".
  5. Передайте суперпредставление, созданное в 2/3.), В вашу переменную "myDelegate"
  6. Звоните [myDelegate responseToSwipe], когда захотите
0 голосов
/ 26 ноября 2010

Вот очень хороший пример того, как применить шаблон делегирования на iPhone.Я скачал код, и он работает довольно хорошо.

http://www.hivestudio.cat/index.php?option=com_content&view=article&id=57:technical-note-the-delegation-pattern-on-the-iphone&catid=35:technical-note-category&Itemid=76

0 голосов
/ 23 сентября 2010

Для пользовательского представления вы можете создать подкласс UIControl и использовать управляющие события:

  • Определить некоторые управляющие события.Вы можете создать 4 управляющих события (UIControlEventApplicationReserved = 0x0F000000)
  • У того, кто хочет получать события, вызовите addTarget: action: forControlEvents:
  • У управляющего вызова [self sendActionsForControlEvents:events]

В качестве альтернативы вы можете использовать интерфейс в стиле UIGestureRecognizer (addTarget: action:).

В качестве альтернативы просто использовать UIGestureRecognizer (OS 3.2 +)

0 голосов
/ 22 сентября 2010

Ваш родительский вид установил себя как суперпредставление подпредставления, когда он добавил подпредставление? В противном случае подпредставление не знает, кто его суперпредставление.

Более стандартный способ именования вещей - вызывать обработчик метода делегатом вместо суперпредставления, делать его свойством и проверять подпредставление как на наличие устанавливаемого делегата, так и на способность обрабатывать метод.

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