恐怕再多的谷歌搜索都无法挽救我的海德。每当我在任何 UIView 上触摸手机屏幕时,我似乎都会收到 SIGABRT 错误。调试器控制台在 SIGABRT 之前发布此错误:
.... [310:207] *** -[UIView _exclusiveTouchView]: unrecognized selector sent to instance 0x14c0c0
.... [310:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIView _exclusiveTouchView]: unrecognized selector sent to instance 0x14c0c0'
(当然,这不是我对_exclusiveTouchView
的具体要求。)
我很乐意发布一些代码,但事实是我找不到(或猜测)这个问题可能来自哪里。这不会发生在任何一个 UIView 上,而是发生在我堆栈中的所有 UIView 上。不过,我可以总结一下显示逻辑,也许这会有所启发。
因此创建了应用程序并分配了一个 UIWindow。然后分配一个单独的 viewcontroller,创建并添加它自己的空白 self.view,代表不同游戏状态的其他 UIViews 附加到它上面。
有趣的是,这个错误不会在模拟器上发生,而是在设备上持续发生。而且我还应该提到,该应用程序尚未覆盖/使用任何 touchesBegan:/Ended:/Moved: 等...换句话说,如果代码中没有这些方法,就会发生此错误。
我真的不明白这个错误来自哪里......有什么建议吗?
编辑请求的代码 是一个简化的状态,仍然会在触摸时生成 SIGABRT:
#import <UIKit/UIKit.h>
#import "WPGame.h"
@class WPGame;
extern WPGame *theGame;
#import "WPGameState.h"
@class IntroView;
@interface IntroStateView : WPGameState {
NSTimer *introTimer;
}
+(IntroStateView*)instance;
@end
.
#import "IntroStateView.h"
#import "StartMenuStateView.h"
static IntroStateView *theOnlyIntro = nil;
@implementation IntroStateView
+(IntroStateView*)instance {
@synchronized(self) {
if (!theOnlyIntro) {
theOnlyIntro = [[IntroStateView alloc] init];
}
}
return theOnlyIntro;
}
- (void)excuseYourself {
[self changeStateOf:theGame toState:[StartMenuStateView instance]];
}
- (void)startUp {
[super startUp];
introTimer = [NSTimer scheduledTimerWithTimeInterval:[theGame introLength]
target:self
selector:@selector(excuseYourself)
userInfo:NULL
repeats:NO];
}
- (void)cleanUp {
[super cleanUp];
}
- (void)handleEvents:(WPGame*)game {
[super handleEvents:game];
}
- (void)dealloc {
theOnlyIntro = nil;
[super dealloc];
}
@end
如果您需要查看 UIView 的 WPGameState 子类的部分内容,可以在这里找到以节省一些帖子长度:http ://tinypaste.com/732bb