IPhone UIView: возможно ли включить взаимодействие с пользователем только в подвидах?

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

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

Любые идеи?


person Syg    schedule 30.04.2010    source источник
comment
Я не уверен на 100% в том, что вы пытаетесь сделать, но это звучит так, как будто что-то лучше сделать с помощью контроллера панели вкладок, метода presentModalViewController или их комбинации? Наличие нескольких пользовательских контроллеров представления, работающих на одном экране, приводит к запутанному коду, а иногда и к дурацким результатам. Apple рекомендует этого не делать.   -  person bpapa    schedule 30.04.2010
comment
В основном это похоже на использование tabbarcontrollor для представления модальных представлений, просто фактическая кнопка является частью (модального) viewcontroller, а не основного экрана.   -  person Syg    schedule 01.05.2010
comment
возможно, вам было бы лучше попытаться настроить контроллер панели вкладок, чтобы он выглядел так, как вы хотите. не уверен, насколько это выполнимо.   -  person Remover    schedule 08.08.2010


Ответы (2)


Вы, кажется, путаете представления и их контроллеры: viewControllers не складываются, они просто являются частью файла nib или xib. С другой стороны, представления могут быть частью иерархии представлений и в этом смысле могут накладываться друг на друга. Функция viewController состоит в том, чтобы управлять и координировать различные представления на экране. Использование контроллера представления для управления одной кнопкой неэффективно: целью контроллера будет облегчение связи между различными кнопками (например, отключение кнопок 1, 2 и 4 при касании цифры 3). Заявление @bpapa о том, что Apple не рекомендует использовать более одного viewController, больше не соответствует действительности. Настоящий раздел Windows, Views и View Controllers в Руководстве по программированию приложений iOS гласит:

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

Одна вещь, которая не прояснена в документах, но которая несколько раз укусила меня за последние недели, заключается в том, что создание viewController целью действия UIControl только имеет эффект, если этот viewController является владельцем файла перо. Скажем, например, что у вас есть перо с двумя viewControllers, gameViewController и scoreViewController. GameView может содержать несколько кнопок, которые действуют как элементы игры, и прикосновение к ним отправляет сообщение о действии методу GameViewController -(void)pieceHasBeenTouched:(id)sender. Это прекрасно работает, если gameViewController является владельцем файла.

Теперь может показаться логичным, что если у вас есть кнопка в scoreView, позволяющая отправить сообщение в scoreViewController, скажем, saveScore или что-то в этом роде. По причинам, которые мне пока не совсем понятны, цепочка ответчиков не позволит вам. Вам нужно сделать так, чтобы кнопка «Сохранить» в представлении счета отправляла сообщение о действии в gameViewController.

Я решаю эту проблему, устанавливая привязки IBOutlet между двумя контроллерами — уведомления — еще одна возможность.

person Elise van Looij    schedule 10.08.2010
comment
Давно я не задавал этот вопрос! Может я не правильно объяснил. Я хорошо осведомлен о различиях между UIViews и их соответствующими контроллерами. Контроллеры представления здесь отвечают не только за действие нажатия кнопки, но и за скольжение наложения в представлении и управление содержимым (например, цветом размера содержимого и т. д.). Так что это в основном настраиваемый tabbarcontroller. - person Syg; 12.08.2010
comment
Извините, что бросаю тень на ваши способности, но что вы имеете в виду? Если все работает нормально, а вопрос изначально сформулирован не очень хорошо, возможно, вам следует удалить его и сократить список «Неотвеченные». - person Elise van Looij; 13.08.2010

Добавьте это в код своего костюмированного UIView:hitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hittedView = [super hitTest:point withEvent:event];
    return hittedView == self.button ? hittedView : nil;
}

Я сослался на это: UserInteraction включить только для подпредставления. Я протестировал код. И это работает!

person sunkehappy    schedule 19.11.2012