willTransitionToState(UITableViewCell)在某些情况下不会被调用

ske*_*tik 7 cocoa-touch uitableview uitextfield ios

我想要实现的目标

我有一个自定义UITableViewCell设有UITextField就地编辑.一个cell's字段应该被启用,而UITableView在编辑模式下,但不是同时细胞的删除确认被显示.

我是如何实现它的

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

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

问题

我90%的路在那里.

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

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

UPDATE

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

2014年4月29日

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

小智 0

声明 KVO 的上下文:

static int KVOContext;
Run Code Online (Sandbox Code Playgroud)

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

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

将观察者添加到scrollView's 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;
}
Run Code Online (Sandbox Code Playgroud)

删除 中的观察者dealloc

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

使用KVO观察变化contentOffset,但用于showingDeleteConfirmation状态enabled

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

警告:视图层次结构可能会在未来的更新中发生变化