iOS 7: ошибка UITextView UITextInputTraits?

Сегодня, работая над Reveal, я узнал об ошибке в обработке UITextView в iOS 7 протокола UITextInputTraits.

UITextInputTraits Протокол имеет методы для настройки того, какую клавиатуру следует отображать, когда пользователь нажимает на UITextView и другие подобные вещи.

iOS 7 также представила новый selectable собственность на UITextView для контроля, включен ли выбор текста. Это намного лучше, чем методы, требуемые в предыдущих выпусках iOS, где вам приходилось создавать подкласс UITextView и возвращать no для canBecomeFirstResponder или альтернативно установить inputDelegate и обрабатывать соответствующие обратные вызовы делегата, чтобы остановить выбор для возникновения.

К сожалению, установка обоих editable а также selectable НЕТ в iOS 7 ломает всеUITextInputTraits методы. Если вы попытаетесь вызвать любой из них, ваше приложение будет зависать с instance does not respond to selector исключение. Что странно, потому что UITextView Экземпляр вернет ДА, если вы позвоните respondsToSelector: для любого из методов, объявленных в UITextInputTraits протокол.

Мне кажется, это ошибка в iOS 7. Я сообщил об этом Apple как радар://15063164.

Я также заметил, что для UITextView, созданного с помощью кода (а не в раскадровках), эта ошибка не выражается. Я не уверен, почему еще. Могут быть дополнительные свойства в работе или тот факт, что UITextView инициализируется через initWithCoder: скорее, чем initWithFrame: и может быть в другом состоянии из-за этого.

Некоторый код, который показывает ошибку:

@interface IBAViewController ()

@property (strong, nonatomic) IBOutlet UITextView *editableAndSelectable;
@property (strong, nonatomic) IBOutlet UITextView *selectable;
@property (strong, nonatomic) IBOutlet UITextView *notEditableOrSelectable;

@end

@implementation IBAViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    /* 
     Remove the define below and we won't crash on the last NSAssert below.  Leave it in
     and we crash (assuming we've created and connected three UITextView's to the IBOutlets above
     in a storyboard for this view controller).
    */

#define USING_STORYBOARD

#ifndef USING_STORYBOARD
    self.editableAndSelectable = [[UITextView alloc] initWithFrame:self.view.bounds];
    self.selectable = [[UITextView alloc] initWithFrame:self.view.bounds];
    self.notEditableOrSelectable = [[UITextView alloc] initWithFrame:self.view.bounds];

    [self.view addSubview:self.editableAndSelectable];
    [self.view addSubview:self.selectable];
    [self.view addSubview:self.notEditableOrSelectable];
#endif

    self.editableAndSelectable.text = @"Text1";
    self.editableAndSelectable.editable = YES;
    self.editableAndSelectable.selectable = YES;

    self.selectable.text = @"Text2";
    self.selectable.editable = NO;
    self.selectable.selectable = YES;

    self.notEditableOrSelectable.text = @"Text3";
    self.notEditableOrSelectable.editable = NO;
    self.notEditableOrSelectable.selectable = NO;

    NSAssert(self.editableAndSelectable.editable == YES, @"Huh?");
    NSAssert(self.editableAndSelectable.selectable == YES, @"Huh?");

    NSAssert([self.editableAndSelectable respondsToSelector:@selector(isSecureTextEntry)], @"Huh?");
    NSAssert([self.editableAndSelectable isSecureTextEntry] == NO, @"Huh?");

    NSAssert(self.selectable.editable == NO, @"Huh?");
    NSAssert(self.selectable.selectable == YES, @"Huh?");

    NSAssert([self.editableAndSelectable respondsToSelector:@selector(isSecureTextEntry)], @"Huh?");
    NSAssert([self.editableAndSelectable isSecureTextEntry] == NO, @"Huh?");

    NSAssert(self.notEditableOrSelectable.editable == NO, @"Huh?");
    NSAssert(self.notEditableOrSelectable.selectable == NO, @"Huh?");

    NSAssert([self.notEditableOrSelectable respondsToSelector:@selector(isSecureTextEntry)], @"Huh?");
    NSAssert([self.notEditableOrSelectable isSecureTextEntry] == NO, @"Huh?"); // crashes here (on iOS 7)
}

@end

Кто-нибудь еще видел это? Или есть какие-нибудь идеи?

0 ответов

Другие вопросы по тегам