【问题标题】:willTransitionToState (UITableViewCell) not called in certain situationwillTransitionToState (UITableViewCell) 在某些情况下未调用
【发布时间】:2013-12-05 19:49:15
【问题描述】:

我想要实现的目标

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

我是如何实现它的

我继承了UITableViewCell 并重写了它的willTransitionToState 方法:

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

问题

我已经完成了 90% 的路。

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

因此,即使在隐藏删除确认时应该启用它,我的文本字段仍处于禁用状态。您可能会认为,鉴于存在“UITableViewCellStateShowingDeleteConfirmationMask”标志这一事实,“willTransitionToState”将被对称调用,但事实并非如此。

更新

UITableViewCell 的 'showingDeleteConfirmation' 属性似乎总是​​给出正确的结果。所以理论上我可以遍历每个调用'showingDeleteConfirmation'的单元格并相应地启用或禁用每个文本字段。这是低效且笨拙的。我正在考虑提交关于“willTransitionToState”的错误报告,但我需要更多数据点。有没有其他人遇到过这个问题?

2014 年 4 月 29 日

Apple 确认这是一个错误。到今天为止,错误报告仍然是开放的。

【问题讨论】:

  • 我也遇到了同样的问题,运气好吗?
  • 一个月前我向 Apple 发送了一份错误报告。 Apple 确认这确实是一个错误 - 具体来说,它是一个开放的、排名 3 的“中等”错误,无论这意味着什么。
  • 感谢更新 leuco
  • 今天完全相同的问题。您是否有指向 Apple 错误报告的链接?
  • 有完全相同的问题。 iOS 7.1。

标签: ios cocoa-touch uitableview uitextfield


【解决方案1】:

为 KVO 声明一个上下文:

static int KVOContext;

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

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

将观察者添加到scrollViewcontentOffset

- (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 的变化,但使用 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];
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多