当包含在 UITableViewCell 中时,UIDatePicker 不起作用
UIDatePicker doesn't work when included in a UITableViewCell
我有一个应用程序,我经常在 table 视图中使用 UIDatePicker
。因此,我定制了 DatePickerTableViewCell
class,它曾经有效(几年前,我不知道确切的日期)。现在我在 iOS 14 再次测试所有内容,日期选择器不会对我打算滚动轮子的手势做出反应。相反,table 视图似乎窃取了滚动手势。即使我没有将首选样式设置为 'Wheels',我也无法与日期选择器进行交互。
要重现它,您需要一个 table 视图控制器,其中包含足够的单元格以使其可滚动(哪些单元格无关紧要):
@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
class 本身:
@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
显示了日期选择器,但我无法与之交互:
您将 UIDatePicker 添加为 UITableViewCell 子类的子视图,而不是作为 UITableViewCellContentView 的子视图,因此它是内容视图的兄弟而不是子视图。我的猜测是内容视图正在吸收触摸,或者内容视图未正确实例化,因为它从未被使用过。
您当前的细胞结构:
DatePickerTableViewCell
-- DatePicker
-- UITableViewCellContentView
切换这条线路:
[self addSubview:datePicker];
对此:
[self.contentView addSubview:datePicker];
在 DatePickerTableViewCell 的 - (id)initWithFrame:(CGRect)frame
中应该允许 DatePicker 正确滚动并且结构将是:
DatePickerTableViewCell
-- UITableViewCellContentView
---- DatePicker
我有一个应用程序,我经常在 table 视图中使用 UIDatePicker
。因此,我定制了 DatePickerTableViewCell
class,它曾经有效(几年前,我不知道确切的日期)。现在我在 iOS 14 再次测试所有内容,日期选择器不会对我打算滚动轮子的手势做出反应。相反,table 视图似乎窃取了滚动手势。即使我没有将首选样式设置为 'Wheels',我也无法与日期选择器进行交互。
要重现它,您需要一个 table 视图控制器,其中包含足够的单元格以使其可滚动(哪些单元格无关紧要):
@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
class 本身:
@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
显示了日期选择器,但我无法与之交互:
您将 UIDatePicker 添加为 UITableViewCell 子类的子视图,而不是作为 UITableViewCellContentView 的子视图,因此它是内容视图的兄弟而不是子视图。我的猜测是内容视图正在吸收触摸,或者内容视图未正确实例化,因为它从未被使用过。
您当前的细胞结构:
DatePickerTableViewCell
-- DatePicker
-- UITableViewCellContentView
切换这条线路:
[self addSubview:datePicker];
对此:
[self.contentView addSubview:datePicker];
在 DatePickerTableViewCell 的 - (id)initWithFrame:(CGRect)frame
中应该允许 DatePicker 正确滚动并且结构将是:
DatePickerTableViewCell
-- UITableViewCellContentView
---- DatePicker