Ответ 1
Проблема решена путем изменения делегата на объект, который находится в моем текстовом представлении.
Итак, у меня есть подкласс 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
Проблема решена путем изменения делегата на объект, который находится в моем текстовом представлении.
Сегодня я столкнулся с такой же проблемой при работе с самодополняющим подклассом 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];
}
Я решил это с помощью 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.