カスタムジェスチャーを開発するときに、デバッグ/トレースメッセージの状態名の表が必要です。この宣言とその使用法は何が間違っていますか?iPhone/XCodeで静的な文字列テーブルを定義する方法は?
static NSDictionary *dictStateNames = nil;
@implementation MyCustomGesture
@synthesize state;
+(void)initStateNames {
if (dictStateNames == nil) {
dictStateNames = [NSDictionary dictionaryWithObjectsAndKeys:
@"StateBegan", [NSNumber numberWithInt:UIGestureRecognizerStateBegan],
@"StateCancelled", [NSNumber numberWithInt:UIGestureRecognizerStateCancelled],
@"StateChanged", [NSNumber numberWithInt:UIGestureRecognizerStateChanged],
@"StateEnded", [NSNumber numberWithInt:UIGestureRecognizerStateEnded],
@"StateFailed", [NSNumber numberWithInt:UIGestureRecognizerStateFailed],
@"StatePossible", [NSNumber numberWithInt:UIGestureRecognizerStatePossible],
@"StateRecognized", [NSNumber numberWithInt:UIGestureRecognizerStateRecognized],
nil];
}
}
-(id) init {
self = [super init];
if (self) {
[MyCustomGesture initStateNames];
state = UIGestureRecognizerStatePossible;
}
return self;
}
-(id) initWithTarget:(id)target action:(SEL)action {
self = [super initWithTarget:target action:action];
if (self) {
[MyCustomGesture initStateNames];
state = UIGestureRecognizerStatePossible;
}
return self;
}
+(NSString*) stateName: (UIGestureRecognizerState) state {
NSString *retName = [dictStateNames objectForKey:[NSNumber numberWithInt:state]];
if (retName == nil) {
return [NSString stringWithFormat:@"Unknown state (%@)", state];
} else {
return retName;
}
}
-(NSString*) currentStateName {
return [MyCustomGesture stateName:state];
}
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%s (%@): %@", __FUNCTION__, [self currentStateName], event);
}
これは正しい答えです。あなたのコードmobibobの問題は、jlehrのように、deallocされているということです。それを正しく保持すると、問題が解決します。 –
これは理にかなっています。私はそれが基本的に間違っていることを知っていましたが、ポインタが「悪くなっていた」(割り当てが解除された)場所を特定できませんでした。 BTW - あなたが示唆しているようにゲッター関数内でコードを初期化するように既に移動しました。今度はinitと合体してください。それはあなたの提案ですべて記録され、正しく動作し、クラッシュしません。 – mobibob
なぜ 'stateNames'は' NSDictionary * 'ではなく 'void'を返しますか? – bcattle