Действия UIButton, установленные в XIB, но не стрельба - PullRequest
2 голосов
/ 26 июля 2011

Описание проблемы короткое, но, думаю, мне не нужно много говорить.Когда я загружаю .xib моего собственного проигрывателя фильмов, для элементов управления UIButton / UIBarButtonItem устанавливаются значения ivars / properties моего объекта File's Owner, а для их действий / селекторов устанавливаются различные локальные методы.Функция никогда не вводится (точка останова gdb не достигнута).

Я подтвердил, что setView: и set...Button: вызываются (еще не выяснил, равны ли они нулю).Я также попытался вручную вызвать addTarget:action:forControlEvents: / setAction: при инициализации пользовательского интерфейса, но безрезультатно.

Здесь также есть лишняя странность: кнопки на самом деле подсвечиваются, а затем остаются выделенными.Таким образом, они переходят от UIControlStateNormal к UIControlStateHighlighted (/ UIControlStateSelected, в зависимости от того, как вращаются отдельные касания), но при UIControlEventTouchUpInside, который в противном случае инициировал бы действие кнопки, кнопка, кажется, остается в своем выделенном /выбранное состояние.

Обратите внимание, что следующие элементы управления в том же .xib работают без проблем:

  • MPVolumeView (в подклассе Apple UISlider)
  • UISlider (с селекторами, установленными для UIControlEvent s ValueChanged, TouchDown, TouchUpInside, TouchUpOutside, TouchCancel, все из которых, кажется, работают все еще)
  • UIGestureRecognizer с (даже однократные нажатия на кнопки в настоящее время работают)

Раньше это работало, так что изменилось в .xib с тех пор?Хорошо:

  • Теперь используя AVPlayerLayer в качестве layerClass представления верхнего уровня (следовательно, представление верхнего уровня также является подклассом UIView).Это должно было исправить некоторую хитрость при загрузке фильма / визуальную задержку.

Это буквально все, что изменилось, по крайней мере, о чем я могу думать ... Я также пытался удалить и повторно подключить розетки в IB.Мысли, которые не обязательно являются решениями, также приветствуются!

РЕДАКТИРОВАТЬ: Хорошо, так вот обзор того, на каких устройствах он работает / работает. Симулятор не тестировался, потому что у меня есть библиотеки .a, которыетолько скомпилированные armv6 / armv7 архитектуры.

  1. iPhone 3G на 4.2.1 (8C148) с джейлбрейком с PwnageTool 4.2, версия для основной полосы частот 05.15.04, без SIM-карты: кнопки не работают
  2. iPad 1 на 4.3.5 (8L1), версия для основной полосы частот 07.11.01, вставлена ​​SIM-карта: кнопки являются включенными
  3. iPad 2 на 5.0b4 (9A5274d), нетосновная полоса (только для WiFi): кнопки не работают
  4. iPhone 4 на 4.3.4 (8K2), вставлена ​​SIM-карта: кнопки являются включенными

I 'мы пытались выполнить развертывание на устройствах 1 и 2 как с iOS 4.3 (Xcode 4.0.2 4A2002a), так и с iOS 5.0b4 (Xcode 4.2 4C139), в обоих случаях результаты одинаковые (телефон не работает, планшет работает).Я также попытался полностью удалить приложение с устройств 1 и 2 и выполнить чистую сборку, те же результаты при переустановке.Устройство 3, к которому я подключился только из Xcode 4.2, и устройство 4 только из Xcode 4.0.2.

Только корреляция, которую я вижу, - нет сигнала ячейки = не работает, но это бессмысленно.Я отключил данные ячейки на устройстве 2 на всякий случай, но он все еще работает нормально по WiFi.

Ответы [ 3 ]

2 голосов
/ 28 мая 2012

У меня была похожая проблема. Оказалось, потому что моей кнопки не было в поле зрения.

Мое приложение находится в альбомном режиме, но вид UIViewController не изменялся автоматически при повороте на некоторых устройствах и / или в версии для iOS.

Чтобы визуализировать проблему, я добавил это, где я инициализировал мой вид и кнопки:

self.view.backgroundColor = [UIColor colorWithRed:1.0f green:0.0f blue:1.0f alpha:0.4f];

При этом я мог видеть, что кнопка, которая в некоторых случаях не реагировала на нажатия, находилась вне поля зрения UIViewController (и, следовательно, не получала события).

Чтобы исправить это, я просто добавил это туда, где я инициализировал мой вид и кнопки:

// Be sure to set the frame for this view controller to be fullscreen
CGSize winSize = [UIScreen mainScreen].bounds.size;

// Note that we switched height and width...this is because
// these values are always for portrait mode
self.view.frame = CGRectMake(0.0f, 0.0f, winSize.height, winSize.width);

Обязательно обратите особое внимание на тот факт, что [UIScreen mainScreen] .bounds.size всегда будет возвращать портретные значения, и вам придется обратить их вспять, если вы работаете в ландшафтном режиме.

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

Если вы используете cocos2d, вы можете использовать это вместо этого, и вам не придется беспокоиться о ручном управлении ориентациями:

CGSize winSize = [[CCDirector sharedDirector] winSize];
1 голос
/ 28 июля 2011

Позвольте мне предположить, что вы используете UIGestureRecognizer.

Вы должны использовать UIGestureRecognizerDelegate и указать распознавателю не запускаться, если пользователь нажимает кнопку.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIButton class]]){
        return NO;
    }
    return YES;
}

Это исправило проблему для меня!

0 голосов
/ 29 июля 2011

Переключение всех обратных вызовов на selector / action на UIGestureRecognizer с вместо этого решило проблему. Все еще не уверен, почему это не работает все же.

...