Мое приложение на основе навигации. UIBarButtonItem на нем.
refreshstopButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self
action:@selector(refreshTapped)];
Я обнаружил, что когда я нажимаю на строку состояния, запускается «refreshTapped» (не вызванный моим большим пальцем, также воспроизводимый с помощью симулятора и щелчка мыши). Stacktrace показывает, что это исходит от
-[UIApplication sendAction:to:from:forEvent:];
Я не понимаю, почему. Иногда мое приложение вылетает с очень похожим стеком, например Сбой на iPhone?
Примечание:
Я также попробовал пример UICatalog, я увидел то же самое: нажатие на строку состояния запускает действие «Назад» UIBarButtonItem (с помощью симулятора).
Поработав некоторое время с симулятором, я понял, что чувствительная область намного больше границы кнопки. Я думаю, может быть, именно так работает Cocoa Touch.
Однако проблема сбоя остается нерешенной. Согласно трассировке стека, похоже, что это вызвано касанием строки состояния.
Вот журнал аварий:
0 libobjc.A.dylib 0x32da1cb2 objc_msgSend + 42
1 UIKit 0x324c3a30 -[UIControl(Deprecated) sendAction:toTarget:forEvent:] + 28
2 UIKit 0x324c3990 -[UIControl(Internal) _sendActionsForEventMask:withEvent:] + 352
3 UIKit 0x32563764 -[UIControl mouseUp:] + 376
4 UIKit 0x3254d314 -[UIView(Internal) _mouseUp:] + 32
5 UIKit 0x3254a480 -[UIWindow _handleMouseUp:] + 108
6 UIKit 0x3254a8da -[UIWindow _statusBarMouseUp:] + 122
7 UIKit 0x32680980 -[UIStatusBar touchesEnded:withEvent:] + 320
8 CoreFoundation 0x328d056a -[NSObject(NSObject) performSelector:withObject:withObject:] + 18
9 UIKit 0x32406094 forwardMethod2 + 60
10 UIKit 0x324a04ca -[UIResponder touchesEnded:withEvent:] + 2
11 UIKit 0x32404bee -[UIWindow _sendTouchesForEvent:] + 362
12 UIKit 0x32404568 -[UIWindow sendEvent:] + 256
13 UIKit 0x323ed30c -[UIApplication sendEvent:] + 292
14 UIKit 0x323ecc4c _UIApplicationHandleEvent + 5084
Я также пытался следовать http://cocoawithlove.com/2009/05/intercepting-status-bar-touches-on.html, чтобы зафиксировать событие в строке состояния. Но, как отметили некоторые другие, он больше не работает в iOS 4.x