iPhone SDK 2: программно добавление кнопки «Информация» - PullRequest
1 голос
/ 04 июня 2009

Я пытаюсь добавить информационную кнопку в свое приложение для предоставления настраиваемой помощи.

Вместо того, чтобы добавить кнопку к пиру и связать событие (touchUpInside) с контроллером, я решил добавить кнопку программно. Кнопка появляется вверх. Когда я добавляю целевой обработчик события, который будет выполняться при касании кнопки, он не работает. Что мой метод (doHelp) не вызывается при прикосновении к кнопке.

Когда я его отлаживал, событие не регистрируется кнопкой! Хотя код не выдает никаких исключений.

Вот фрагмент кода ОТ представления:

    // Create a Button to get Help      
    UIButton *helpButton =  [UIButton buttonWithType:UIButtonTypeInfoDark ] ;
    buttonRect = helpButton.frame;

    // CALCulate the bottom right corner
    buttonRect.origin.x = rect.size.width - buttonRect.size.width - 8;
    buttonRect.origin.y = rect.size.height - buttonRect.size.height - 8; 
    [helpButton setFrame:buttonRect];

    [helpButton addTarget:self action:@selector(doHelp:) forControlEvents:UIControlEventTouchUpInside];
    [helpButton setEnabled:TRUE];
    [self addSubview:helpButton];

........

// Another METHOD ELSEWHERE in the VIEW object
-(void)doHelp:(id)Sender
{
    [self setHelpNeeded:TRUE];
    [self setNeedsDisplay];
}

Что я делаю не так, пожалуйста? Я посмотрел на справку и образцы SDK и очень расстроен! Надеюсь, еще пара глаз поможет! : -)

Этот фрагмент кода находится в View Object на тот случай, если вам нужно это знать. Я просто добавил doHelp, чтобы помочь первым двум респондентам ... спасибо.

** ОБНОВЛЕНИЕ 6/4/09 ** - Я пытался всю ночь, и ничего не получалось. Я думаю, что в настройке селектора метода что-то не так, так как мой метод никогда не вызывается. Все остальное выглядит хорошо. Даже использование файла NIB не работает. Я пометил кнопку, извлек ее и добавил селектор метода, но безрезультатно. Есть что-то фундаментальное, что я делаю неправильно ... Ааааа !!! Есть идеи, кто-нибудь?

Ответы [ 5 ]

4 голосов
/ 14 июня 2009

Решено наконец !!! и узнал что-то взамен. Мне понадобилось несколько дней, чтобы понять это.

Причина, по которой мой объект UIButton не работал, заключалась в том, что я обнаружил, что в случае объекта UIIMageView:

"initWithImage: Этот метод настраивает кадр приемника в соответствии с размером указанного изображения. Он также отключает взаимодействие с пользователем для просмотра изображения по умолчанию."

И моя UIButton была назначена в качестве подпредставления элемента управления UIImageView !!!

Не было ошибок / предупреждений. Просто тихо отключается.

Решение : Создан объект-контейнер UIView, который теперь содержит UIImageView И кнопку, чтобы кнопка выглядела как наложенная на изображение, но на самом деле это одноуровневое изображение и подпредставление пустого контейнера UIView.

1 голос
/ 04 июня 2009

Это было некоторое время, но я думаю, что вашему addTarget нужно взять объект, который содержит селектор doHelp:, например, так:

[helpButton addTarget:self action:@selector(doHelp:)];

при условии, что где-то в том же самом виде у вас есть:

- (void)doHelp: { }

Передача nil в addTarget означает, что вы отправляете этот селектор ни одному получателю.

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

У меня была похожая проблема, когда кнопки находились вне поля зрения и не получали сообщения касания

Помогает установить цвет фона родительского представления, чтобы увидеть, что кнопка находится за его пределами:

...
[buttonParentView addSubview: myButton];
buttonParentView.backgroundColor = [UIColor cyanColor];
0 голосов
/ 22 января 2010

Я сталкивался с этим, пока гуглил решение той же проблемы. По крайней мере, с 3.x SDK все, что вам нужно сделать, это установить для свойства UserInteractionEnabled UIImageView значение YES.

Спасибо за публикацию вашего открытия о проблеме, я бы даже не подумал взглянуть на это.

0 голосов
/ 04 июня 2009

Проблема в том, что вы addTarget:nil там. Селектор, который вы дали ему для действия, - это просто сообщение, которое он отправит своей цели. Вы не дали ему цель, поэтому он не знает, что делать с этим сообщением. Вы, вероятно, хотите передать self вместо nil.

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