2015-01-20 3 views
2

Я создал UIView, который должен быть добавлен в BarButtonItem. Однако я не могу установить действие на эту кнопку. Вот код, который я использую:Установить действие для пользовательского UIBarButtonItem

self.menuBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.containerView]; 
    [self.menuBarButton setTarget:self]; 
    [self.menuBarButton setAction:@selector(menuButtonTapped)]; 
    self.navigationItem.leftBarButtonItem = self.menuBarButton; 

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

 [self.navigationItem.leftBarButtonItem setTarget:self]; 
     [self.navigationItem.leftBarButtonItem setAction:@selector(menuButtonTapped)]; 

Когда я делаю это для обычного элемента барбюля, он работает. Не могли бы вы понять, что случилось?

+0

Попробуйте следующее: UIButton * infoButton = [кнопка UIButtonWithType: UIButtonTypeInfoLight]; [infoButton addTarget: self action: @selector (displayAboutUs) forControlEvents: UIControlEventTouchDown]; UIBarButtonItem * itemAboutUs = [[UIBarButtonItem alloc] initWithCustomView: infoButton]; – weso

ответ

5

A UIBarButtonItem инициализирован с настраиваемым представлением expects the view to handle user interaction:

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

Если ваш UIView не обрабатывает любое взаимодействие пользователя еще, то, как говорит Miken, вы можете заменить UIView с UIButton, что вы настроили с addTarget:selector.

В частности, если вы пытаетесь установить изображение, UIButton может сделать это через setImage:forState:.

См. Также this answer.

0

Когда вы пользуетесь пользовательским представлением для UIBarButtonItem, вы должны сами обрабатывать действия. Замените свое пользовательское представление на UIButton или добавьте UIButton к своему пользовательскому представлению, а затем добавьте целевой переключатель & к кнопке.

Вот пример, но имейте в виду, что я свободно формирую этот пример, поэтому он может быть не на 100% точным кодом, но концепция будет такой же.

UIButton *button = [UIButton buttonWithType:UIBarButtonTypeCustom]; 
UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithCustomView:button]; 
[button addTarget:self selector:@selector(myBtnClk)]; 
0

Чтобы добавить действие к кнопке, вам нужно две вещи: создать метод, а затем добавить его к кнопке. Вот метод (обратите внимание на синтаксис):

- (IBAction) my_method : (id) sender { 
UIButton * btn = sender; 
} 

Теперь назначение действий (где была создана кнопка):

[ my_button addTarget : self 
       action : @selector(my_method :) 
    forControlEvents : UIControlEventTouchUpInside ]; 
0

Вместо использования - setAction в одиночку, я рекомендую использовать: - addTarget:action:forControlEvents:. В iOS (AppKit) существует много типов событий. Вы можете посмотреть прикрепленное изображение для справки. Обычно касание внутри подходит для нажатия кнопки.

+0

Где я должен позвонить - addTarget: действие: forControlEvents:? Я не создавал этот метод для self.menuBarButton или self.navigationItem.leftBarButtonItem – DenFav

+0

Я тоже не нашел это действие для UIBarButtonItem на Ctrl Перетаскивание в мой код. Похоже, для UIBarButtonItem существует только событие action –

0

Я решил эту проблему. Все ответы касались добавления цели и действий в UIButton, а затем создания UIBarButtonItem с помощью этой кнопки. Но поскольку я сказал, что действительно необходимо установить UIView на эту кнопку (я забыл сказать, что это необходимо, потому что этот UIView имеет анимацию, возможно, поэтому все ответы были хорошими, но неправильными для моей ситуации.) Но один ответ (https://stackoverflow.com/a/28054357/4464891) от Джейсон Оуэн дает мне отличную идею.Я должен использовать свой собственный взгляд, поэтому я поставил селектор в моей пользовательской UIView путем добавления UITapGestureRecognizer с initWithTarget:action::

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(menuButtonTapped)]; [self.containerView addGestureRecognizer:tapRecognizer];

И когда я нажимаю кнопку tapRecognizer работает мой селектор. Итак, это все. Надеюсь, это будет полезно для кого-то =)

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