Изучает ли ключевое значение работу с текстовым свойством UITextView?

У меня худшее время, когда мы наблюдаем ключевое значение, работая с текстовым свойством UITextView. Я могу успешно добавить наблюдателя, я могу даже удалить того же наблюдателя. У меня есть tableview с несколькими ячейками - у некоторых есть UITextFields, у некоторых есть UISegmentSelectors, а у UITextView. Все остальные поля успешно наблюдаются моим основным объектом данных (подкласс NSMangedObject) EXCEPT для UITextView. При необходимости я могу отправить код.

Отправленный код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *UserProfileCellIdentifier = @"UserProfileCellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                         UserProfileCellIdentifier];
if (cell == nil) 
{
    [_tableCellsNib instantiateWithOwner:self options:nil];

    switch (indexPath.row)
    {
            // UserName Row
        case UserNameRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"UserNameLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeNormal;
            _textFieldCell.boundProperty = @"UserName";
            _textFieldCell.tag = indexPath.row;
            _textFieldCell.errorHandler = self;
            _textFieldCell.boundControl = _textFieldCell.cellTextField;

            [_textFieldCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextField.text" options:NSKeyValueObservingOptionNew context:NULL];

            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case PasswordRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"PasswordLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeNormal;
            _textFieldCell.cellTextField.secureTextEntry = YES;
            _textFieldCell.boundProperty = @"Password";
            _textFieldCell.tag = indexPath.row;
            _textFieldCell.errorHandler = self;
            _textFieldCell.boundControl = _textFieldCell.cellTextField;

            [_textFieldCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextField.text" options:NSKeyValueObservingOptionNew context:NULL];

            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case PasswordConfirmRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"PasswordConfirmLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeNormal;
            _textFieldCell.cellTextField.secureTextEntry = YES;
            _textFieldCell.tag = indexPath.row;

            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case FirstNameRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"FirstNameLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeNormal;
            _textFieldCell.boundProperty = @"FirstName";
            _textFieldCell.tag = indexPath.row;
            _textFieldCell.errorHandler = self;
            _textFieldCell.boundControl = _textFieldCell.cellTextField;

            [_textFieldCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextField.text" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case LastNameRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"LastNameLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeNormal;
            _textFieldCell.boundProperty = @"LastName";
            _textFieldCell.tag = indexPath.row;
            _textFieldCell.errorHandler = self;
            _textFieldCell.boundControl = _textFieldCell.cellTextField;

            [_textFieldCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextField.text" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case DateOfBirthRowIndex:
            _textFieldCell.cellLabel.text = NSLocalizedString(@"BirthDateLabel", @"User Profile TableView");
            _textFieldCell.cellType = CellTypeDatePicker;
            _textFieldCell.boundProperty = @"DateOfBirth";
            _textFieldCell.tag = indexPath.row;
            _textFieldCell.errorHandler = self;
            _textFieldCell.boundControl = _textFieldCell.cellTextField;

            [_textFieldCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextField.text" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _textFieldCell;

            self.textFieldCell = nil;
            break;
        case GenderSelfRowIndex:
            _genderSelectCell.cellLabel.text = NSLocalizedString(@"UserSexLabel", @"User Profile TableView");
            _genderSelectCell.boundProperty = @"GenderSelf";
            _genderSelectCell.errorHandler = self;
            _genderSelectCell.boundControl = _genderSelectCell.cellGenderSegment;
            _genderSelectCell.tag = indexPath.row;

            [_genderSelectCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellGenderSegment.selectedSegmentIndex" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _genderSelectCell;

            self.genderSelectCell = nil;
            break;
        case GenderInterestedInRowIndex:
            _genderSelectCell.cellLabel.text = NSLocalizedString(@"UserInterestedInLabel", @"User Profile TableView");
            _genderSelectCell.boundProperty = @"GenderInterestedIn";
            _genderSelectCell.errorHandler = self;
            _genderSelectCell.boundControl = _genderSelectCell.cellGenderSegment;
            _genderSelectCell.tag = indexPath.row;

            [_genderSelectCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellGenderSegment.selectedSegmentIndex" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _genderSelectCell;

            self.genderSelectCell = nil;
            break;
        case IntroductionRowIndex:
            _textViewCell.cellLabel.text = NSLocalizedString(@"IntroductionLabel", @"User Profile TableView");
            _textViewCell.boundControl = _textViewCell.cellTextView;
            _textViewCell.errorHandler = self;
            _textViewCell.boundProperty = @"Introduction";
            _textViewCell.tag = indexPath.row;

            [_textViewCell addObserver:[MBUtilities getAppDelegate].userProfile forKeyPath:@"cellTextView.text" options:NSKeyValueObservingOptionNew context:NULL];
            cell = _textViewCell;

            self.textViewCell = nil;
            break;
    };
}

return cell;
}

Обсуждение. Каждая ячейка загружается из внешнего файла NIB, затем инициализируется различными свойствами. Все ячейки работают с наблюдением за ключевым значением, за исключением самого последнего с UITextView. Дайте мне знать, нужна ли дополнительная информация.

Ответ 1

UIKit не гарантируется KVO-совместимый:

Примечание. Хотя классы UIKit Framework обычно не поддерживают KVO, вы все равно можете реализовать его в пользовательских объектах вашего приложения, включая пользовательские представления.

Он может работать с некоторыми классами +, но это не так, и может измениться в разных версиях iOS. См. Дэйвс отвечает на этот вопрос; Дейв работает на UIKit.

Ответ 2

Использование UITextViewTextDidChangeNotification лучше.

Я сделал следующее:

Сначала зарегистрируйтесь в NSNotificationCenter:

- (id)init
{
    [super init];
    if (self)
    {
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self 
               selector:@selector(textDidChange:) 
                   name:UITextViewTextDidChangeNotification
                 object:nil];
    }
    return self;
}

- (void)dealloc 
{
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc removeObserver:self];
}

Затем определите обработчик уведомлений:

- (void)textDidChange:(NSNotification *)note
{
    NSLog(@"Observation...");
}

Теперь, когда текст в объекте UITextView изменяется, будет вызываться метод textDidChange:.

Ответ 3

Хорошо, поэтому мне не повезло найти какое-либо объяснение этого поведения, и если кто-то не скажет мне об этом, я считаю, что это ошибка в IOS.

Мне удалось заставить его работать с этим взломом:

- (void)textViewDidEndEditing:(UITextView *)textView
{
    NSLog(@"Editing Ended");
    textView.text = textView.text;
}

После того, как этот код был добавлен, voila, срабатывает функция observValueForKeyPath!

Ответ 4

Вы пытались выполнить UITextViewDelegate и назначить ему thisIsYourTextView.delegate?

Ну, я нашел этот учебник, может быть, это немного изменит ситуацию.