【问题标题】:UIDatePicker doesn't work when included in a UITableViewCell当包含在 UITableViewCell 中时,UIDatePicker 不起作用
【发布时间】:2021-04-07 05:03:49
【问题描述】:

我有一个应用程序,我经常在表格视图中使用UIDatePicker。因此,我定制了 DatePickerTableViewCell 类,它曾经可以工作(几年前,我不知道确切的日期)。现在我在 iOS 14 上再次测试所有内容,日期选择器不会对我打算滚动轮子的手势做出反应。相反,表格视图似乎窃取了滚动手势。即使我没有将首选样式设置为“轮子”,我也无法与日期选择器交互。

要重现它,您需要一个具有足够单元格的表格视图控制器以使其可滚动(哪些单元格无关紧要):

@implementation TableViewController

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return indexPath.row == 0 ? 216 : tableView.rowHeight;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row > 0)
        return [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    return [[DatePickerTableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 216)];
}

@end

当然还有DatePickerTableViewCell 类本身:

@interface DatePickerTableViewCell () {
    UIDatePicker *datePicker;
}

@end

@implementation DatePickerTableViewCell

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake((frame.size.width - 320) / 2, 0, 320, 216)];
        datePicker.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin
            | UIViewAutoresizingFlexibleRightMargin;
        datePicker.datePickerMode = UIDatePickerModeDate;
        if (@available(iOS 13.4, *)) {
            datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
        }
        [self addSubview:datePicker];
    }
    return self;
}

@end

日期选择器显示,但我无法与之交互:

【问题讨论】:

    标签: ios objective-c uitableview uidatepicker


    【解决方案1】:

    您将 UIDatePicker 添加为 UITableViewCell 子类的子视图,而不是 UITableViewCellContentView 的子视图,因此它是内容视图的兄弟而不是子视图。我的猜测是内容视图正在吸收触摸,或者内容视图没有被正确实例化,因为它从未使用过。

    当前单元格的结构:

    DatePickerTableViewCell
    -- DatePicker
    -- UITableViewCellContentView
    

    切换这一行:

    [self addSubview:datePicker];
    

    到这里:

    [self.contentView addSubview:datePicker];
    

    在 DatePickerTableViewCell 的 - (id)initWithFrame:(CGRect)frame 内应该允许 DatePicker 正确滚动并且结构将是:

    DatePickerTableViewCell
    -- UITableViewCellContentView
    ---- DatePicker
    

    【讨论】:

    • 谢谢,就像一个魅力!我想知道为什么(以及何时)它坏了;我似乎是在 2014 年创建的,所以那是相当多的 iOS 版本之前...
    • 很高兴为您工作。我认为它可能在 iOS 9 附近的某个地方发生了变化。我在讨论论坛上发现这篇文章引用了从 iOS 9 开始的类似内容:developer.apple.com/forums/thread/19322
    • 我很高兴你问这个问题,我亲爱的朋友。我可以对 Xamarin.iOS 使用类似的逻辑。 ContentView.AddSubview(_datePicker);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2016-03-09
    • 2015-07-12
    • 2018-02-18
    • 2018-10-12
    相关资源
    最近更新 更多