我有一个自定义的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日
解决方法
static int KVOContext;
- (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]; } }
警告:视图层次结构可能在将来的更新中更改