我有一个正常UITableView
,其上有一些常规UITableViewCell
。我知道如何将UIDatePicker
与UITextField
联系起来。但现在我想知道是否可以通过点击整个单元格来呈现选择器,即使它上面没有文本字段。
我尝试的是,我在选择器上添加了UIToolBar
作为子视图,并将[self showPicker]
之类的代码放入其中一个UITableViewDelegate
方法中:didSelectRowAtIndexPath
然后当我轻拍了选择器所显示的牢房。
但问题是,当我点击前面提到的工具栏上的UIBarButtonItem
按钮时,即使我添加了正常按钮应该具有的目标和动作,它也没有触发它的动作。
如果您想查看一些代码,请参阅自定义方法showPicker
和常规内容:
-(void)loadBirthdayPicker
{
CGFloat pickerWidth = kScreenWidth;
CGFloat pickerHeight = kScreenHeight/3;
CGFloat toolHeight = 40;
CGFloat toolWidth = kScreenWidth;
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonPressed:)];
UIBarButtonItem *flexibleSpaceMiddle = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonPressed:)];
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -toolHeight, toolWidth, toolHeight)];
[toolbar setItems:@[cancelButton, flexibleSpaceMiddle, doneButton]];
if (!_datePicker)
{
_datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, kScreenHeight, pickerWidth, pickerHeight)];
}
_datePicker.datePickerMode = UIDatePickerModeDate;
[_datePicker addSubview:toolbar];
[self.view addSubview:_datePicker];
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[_datePicker setFrame:CGRectMake(0, kScreenHeight-pickerHeight-60, pickerWidth, pickerHeight)];
}
completion:nil];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self loadBirthdayPicker];
}
-(void)doneButtonPressed:(UIBarButtonItem *)sender
{
NSLog(@"done");
}
答案 0 :(得分:0)
您希望tableview中的每一行都显示日期选择器吗?
看起来像一个奇怪的用例,但你可以控制从单元格到.h文件的拖动并创建一个名为togglePicker的动作方法。
还可以从日期选择器的任何位置控制拖动,并为其指定一个出口属性datePicker。
然后,您可以通过在操作方法中切换.hidden属性来显示或不显示您的日期选择器。
创建一个名为datePickershowing的布尔属性。
然后你在方法中的代码应该是:
-(void) togglePicker {
if (dateShowing==YES) {
datePicker.hidden=NO;
dateShowing=NO;
}
else if (dateShowing==NO) {
datePicker.hidden=YES;
dateShowing=YES;
}
}
答案 1 :(得分:0)
这里的问题不是没有调用动作,而是工具栏按钮根本没有接收到点击事件。您的工具栏超出了日期选择器的范围,您通常无法与超级视图范围之外的任何视图进行交互。您可以通过将工具栏设置为剪辑视图来验证这一点
_datePicker.clipsToBounds = YES;
这是一个可解决的问题,有一个非常简单的UIDatePicker子类。 我创建了一个名为MyDatePicker的新子类,根本没有修改.h文件,并将此方法添加到实现中
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// Check to see if the hit point is in any of our subviews, even if they are outside our bounds
for (UIView *subview in self.subviews) {
if (CGRectContainsPoint(subview.frame, point)) {
// We need to convert the point to the subview's coordinate system
CGPoint pointInSubview = [self convertPoint:point toView:subview];
// And now have our subview continue with the normal hitTest:withEvent: so our controls work as expected
return [subview hitTest:pointInSubview withEvent:event];
}
}
// Our check failed to return anything, so defer to the super's implemenation
return [super hitTest:point withEvent:event];
}
现在您只需要更改代码以使用新的MyDatePicker而不是UIDatePicker,工具栏按钮将接收触摸事件并在点击时调用其操作。不要忘记在界面中更改您的属性类以匹配。
_datePicker = [[MyDatePicker alloc] initWithFrame:CGRectMake(0, kScreenHeight, pickerWidth, pickerHeight)];