如何通过点击UITableViewCell加载UIDatePicker

时间:2016-01-19 01:46:02

标签: ios uitableview uidatepicker

我有一个正常UITableView,其上有一些常规UITableViewCell。我知道如何将UIDatePickerUITextField联系起来。但现在我想知道是否可以通过点击整个单元格来呈现选择器,即使它上面没有文本字段。

我尝试的是,我在选择器上添加了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");
}

2 个答案:

答案 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)];