Как передать управление нажатием на объект в основной контроллер?

Есть основной контроллер ViewController - в нем основной view

Есть подкласс TableView : UIView
Этот view создается в storyboard
В какой то момент времени, в TableView создаются программно много subview - класса CardView - это игральные карты
каждой карте добавляется обработка нажатия
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
        [cView addGestureRecognizer:singleTap];


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

Вопрос 1. Есть ли возможность получить ссылку на главный контроллер, для того чтобы написать initWithTarget: ссылка_на_контроллер
если это не невозможно или "не правильно", то как лучше реализовывать?
Вариант 1. реализовать метод tap в классе CardView, а там посылать Notifications
Вариант 2. попробовать придумать решение с делегированием этого метода (совсем для меня пока непонятная область)
Вариант 3. Передавать при создании объектов CardView ссылку на основной контроллер, и хранить ее как свойство

Прошу прощения, но я пока только разбираюсь с ios программированием, и наверное могу задавать глупые вопросы.
  • Вопрос задан
  • 2701 просмотр
Пригласить эксперта
Ответы на вопрос 2
alexyat
@alexyat
iOS Developer
2 и 3 это одно и тоже. 1 способ(с notifications) используется если нужно оповестить несколько разрозненных объектов. Думаю в Вашем случаи проще всего сделать ссылку на контроллер в CardView.
Ответ написан
kaspartus
@kaspartus
У вас всего один VC, логику мы должны писать только в контроллерах. Этот VC должен знать об этом tableView. Потому и делегатные методы tableView должны быть в этом контроллере, те что отвечают за создание ячейки, выбор ячейки и прочее, а значит и создаваться cardView будет в классе VC, но тогда вопросов об обработке тапов не возникает. Так что вы зря логику вынесли во View классы.

Если хотим разделить логику, то нужен еще один VC2, который будет держать tableView, будет создавать карты, узнавать об их нажатии. При этом создавать его будет основной VC1 и сразу добавлять вью VC2 на свой. Вот тогда VC2 будет делегировать нажатия по картам в VC1.
Примеров создания кастомных делегатов очень много, конкретный не посоветую, но они легко гуглятся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы