Подтвердить что ты не робот

IPhone: вызов метода parent/super из подвью

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

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

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

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

Я пробовал

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

На делегате я попробовал self.tabcontroller.parentviewcontroller, selectedview, super view.super

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

4b9b3361

Ответ 1

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

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

@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];

Ответ 2

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

  • Создайте протокол: Назовите его, как вам нравится (я назову его "MyProtocol" ) и добавлю к нему определение функции, которую вы хотите вызвать в своем супервизоре, позвоните на "responseToSwipe"
  • Если ваш супервизор является UIView, вам необходимо создать свой собственный подкласс UIView и сделать ваш супервизор экземпляром этого класса.
  • Пусть ваш (новый) созданный класс супервизора реализует протокол 1.) реализует метод "responseToSwipe"
  • Создайте переменную экземпляра идентификатора типа в вашем подзоне и назовите его, как вам нравится, например. "MyDelegate".
  • Передайте супервизор, созданный в 2/3.) в переменную myDelegate.
  • Вызовите [myDelegate replyToSwipe], когда захотите

Ответ 3

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

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

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

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

Ответ 4

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

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