12

そのため、UITextField独自のサブクラスがありDelegate、キーボード ショートカットを使用するとクラッシュします。それは最大にCPUなり、エラーは発生しません。そのまま自分自身を割り当てDelegateなくても、問題なく動作します。そのまま割り当てられるとDelegate、(オプションの)メソッドを使用しない場合でもクラッシュします。

自分で試してみてください:

サブクラスUITextField

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        self.delegate = self;

    }
    return self;
}

クラッシュするはずです。

編集 バックトレース:

* thread #1: tid = 0x3bb8d, 0x39f14726 libobjc.A.dylib`lookUpImpOrNil + 18, queue = 'com.apple.main-thread, stop reason = signal SIGSTOP
    frame #0: 0x39f14726 libobjc.A.dylib`lookUpImpOrNil + 18
    frame #1: 0x39f0dcb6 libobjc.A.dylib`class_respondsToSelector + 34
    frame #2: 0x39f1d05c libobjc.A.dylib`-[NSObject respondsToSelector:] + 32
    frame #3: 0x323b9242 UIKit`-[UITextField respondsToSelector:] + 46
    frame #4: 0x325c88a2 UIKit`-[UITextField customOverlayContainer] + 50
    frame #5: 0x325c8730 UIKit`-[UITextField automaticallySelectedOverlay] + 28
    frame #6: 0x32554208 UIKit`-[UIKeyboardImpl inputOverlayContainer] + 424
    frame #7: 0x32553942 UIKit`-[UIKeyboardImpl _autocorrectPromptRects] + 454
    frame #8: 0x323c7530 UIKit`-[UIKeyboardImpl updateAutocorrectPrompt:] + 368
    frame #9: 0x323e63e0 UIKit`-[UIDelayedAction timerFired:] + 80
    frame #10: 0x305fbe6c Foundation`__NSFireTimer + 64
    frame #11: 0x2fbe1e86 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
    frame #12: 0x2fbe1aa2 CoreFoundation`__CFRunLoopDoTimer + 794
    frame #13: 0x2fbdfe2a CoreFoundation`__CFRunLoopRun + 1218
    frame #14: 0x2fb4a540 CoreFoundation`CFRunLoopRunSpecific + 524
    frame #15: 0x2fb4a322 CoreFoundation`CFRunLoopRunInMode + 106
    frame #16: 0x348812ea GraphicsServices`GSEventRunModal + 138
    frame #17: 0x324011e4 UIKit`UIApplicationMain + 1136
    frame #18: 0x0009929c Today`main(argc=1, argv=0x27d79c80) + 164 at main.m:29
4

3 に答える 3

13

今日、自己委任UITextFieldサブクラスを使用しているときに同じ問題が発生しました。デリゲートを self 以外のものに変更できない場合は、無効なオブジェクトを返す可能性のあるメソッドをrespondsToSelector実装するのではなく、オーバーライドすることをお勧めします (それが のインスタンスであると確信していますか? iOS がそうではないことをどうやって知ることができますか? aまたは aまたはその他のタイプのオブジェクトを要求していますか?)customOverlayContainerUITextFieldUIViewCGLayer

-(BOOL) respondsToSelector:(SEL)aSelector {

    NSString * selectorName = NSStringFromSelector(aSelector);

    if ([selectorName isEqualToString:@"customOverlayContainer"]) {

        NSLog(@"preventing self.delegate == self crash");

        return NO;
    }

    return [super respondsToSelector:aSelector];
}
于 2014-10-17T17:21:59.797 に答える
5

テキストビューを開始するオブジェクトにデリゲートを変更することで問題が解決しました。

于 2013-12-14T20:43:28.077 に答える
1

カスタム customOverlayContainer でこれを解決し、textFiled を返します。例えば。

@implementation CustomTextField

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (id)customOverlayContainer {
    return self;
}

@end

iOS 7 および iOS 6 でテスト済み。

于 2014-07-03T11:36:21.377 に答える