Делегат UITextField перескакивает до 100% использования ЦП и сбой при использовании сочетания клавиш

Итак, у меня есть подкласс UITextField, который является его собственным Delegate и сбой при использовании сочетаний клавиш. Он высвечивается на CPU и не дает ошибки. Не присваивая себя Delegate, он работает без проблем. Когда он назначается как Delegate, он сбой даже при использовании ни одного из (необязательных) методов.

Попробуйте сами:

Подкласс UITextField.

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

        self.delegate = self;

    }
    return self;
}

Он должен потерпеть крах.

ИЗМЕНИТЬ Backtrace:

* 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

Ответ 1

Проблема решена путем изменения делегата на объект, который находится в моем текстовом представлении.

Ответ 2

Сегодня я столкнулся с такой же проблемой при работе с самодополняющим подклассом UITextField. Если невозможно изменить делегат на что-то другое, кроме self, я бы рекомендовал переопределить respondsToSelector вместо того, чтобы внедрять метод customOverlayContainer, который может вернуть недопустимый объект (вы уверены, что он должен быть экземпляром UITextField "Как вы знаете, что iOS не запрашивает UIView или CGLayer или любой другой тип объекта?)

-(BOOL) respondsToSelector:(SEL)aSelector {

    NSString * selectorName = NSStringFromSelector(aSelector);

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

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

        return NO;
    }

    return [super respondsToSelector:aSelector];
}

Ответ 3

Я решил это с помощью custom 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.