键值观察对UITextView的Text属性有效吗?

问题描述

| 使用UITextView的text属性观察键值时,我遇到最糟糕的时间。我可以成功添加观察者,甚至可以删除该观察者。我有一个包含多个单元格的tableview-一些具有UITextField,一些具有UISegmentSelectors,一个具有UITextView。我的核心数据对象(NSMangedObject的子类)除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的单元格外,所有单元格都可以观察键值。让我知道是否需要其他信息。     

解决方法

        不保证UIKit兼容KVO:   注意:尽管UIKit框架的类通常不支持KVO,但是您仍然可以在应用程序的自定义对象(包括自定义视图)中实现它。 它可能适用于某些类+键,但是并不可靠,并且可能会在不同的iOS版本中发生变化。请参阅Dave对这个问题的答案; Dave在UIKit上工作。     ,        使用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:
方法。     ,        好的,所以我没有运气找到这种行为的任何解释,除非有人可以告诉我,否则我认为这是IOS中的错误。 我能够使它与这种黑客一起工作:
- (void)textViewDidEndEditing:(UITextView *)textView
{
    NSLog(@\"Editing Ended\");
    textView.text = textView.text;
}
添加该代码后,瞧,将触发watchValueForKeyPath!     ,        您是否尝试实现UITextViewDelegate并将thisIsYourTextView.delegate分配给它? 好吧,我找到了本教程,也许它将使事情变得更加清晰。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...