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'将被称为对称,但事实并非如此.
似乎showingDeleteConfirmationUITableViewCell 的' '属性总是给出正确的结果.因此理论上我可以遍历调用' showingDeleteConfirmation'的每个单元格并相应地启用或禁用每个文本字段.这是低效率和kludgy.我正在考虑提交' willTransitionToState' 的错误报告,但我需要更多的数据点.还有其他人遇到过这个问题吗?
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)
警告:视图层次结构可能会在未来的更新中发生变化
| 归档时间: |
|
| 查看次数: |
1531 次 |
| 最近记录: |