ios – 在某些情况下未调用willTransitionToState(UITableViewCell)

前端之家收集整理的这篇文章主要介绍了ios – 在某些情况下未调用willTransitionToState(UITableViewCell)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要实现的目标

我有一个自定义的UITableViewCell,其中包含用于就地编辑的UITextField.应该在UITableView处于编辑模式时启用单元格字段,但在显示单元格的删除确认时不启用.

我是如何实现它的

我已经将UITableViewCell子类化并重写了它的willTransitionToState方法

- (void)willTransitionToState:(UITableViewCellStateMask)state {
   [super willTransitionToState:state];
   self.nameField.enabled = !(state & UITableViewCellStateShowingDeleteConfirmationMask)
                            && (state & UITableViewCellStateEditingMask);
}

问题

我90%的路在那里.

用户按下单元格的“ – ”按钮后调用“willTransitionToState”.显示删除确认,并根据需要禁用我的文本字段.但是,如果用户决定不删除单元格并通过向右滑动隐藏删除确认,该怎么办?在这种情况下,不会调用’willTransitionToState’.

因此,即使在隐藏删除确认时应启用,我的文本字段也会处于禁用状态.您会认为,鉴于存在’UITableViewCellStateShowingDeleteConfirmationMask’标志这一事实,’willTransitionToState’将被对称调用,但似乎并非如此.

UPDATE

似乎UITableViewCell的’shownDeleteConfirmation’属性总是给出正确的结果.所以理论上我可以遍历调用’showsDeleteConfirmation’的每个单元格并相应地启用或禁用每个文本字段.这是低效率和kludgy.我正在考虑提交关于’willTransitionToState’的错误报告,但我需要更多的数据点.还有其他人遇到过这个问题吗?

2014年4月29日

Apple确认这是一个错误.截至今天,错误报告仍然是开放的.

解决方法

声明KVO的上下文:
static int KVOContext;

使用自定义getter获取单元格中的scrollView:

- (UIScrollView *)scrollViewToObserve
{
    UIView *view = self.subviews[0];
    return (view != nil && [view isKindOfClass:[UIScrollView class]]) ? (UIScrollView *)view : nil;
}

将观察者添加到scrollView的contentOffset:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self.scrollViewToObserve addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:&KVOContext];
    }
    return self;
}

删除dealloc中的观察者:

- (void)dealloc
{
    [self.scrollViewToObserve removeObserver:self forKeyPath:@"contentOffset" context:&KVOContext];
}

使用KVO观察对contentOffset的更改,但使用showsDeleteConfirmation作为启用状态:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (context == &KVOContext) {
        if ([keyPath isEqualToString:@"contentOffset"]) {
            self.textField.enabled = !self.showingDeleteConfirmation;
        }
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

警告:视图层次结构可能在将来的更新中更改

猜你在找的iOS相关文章