来自UITableviewcell的Popover无法正常工作

时间:2016-06-03 14:47:57

标签: ios objective-c uitableview uipopovercontroller

我有动态tableview我有6个单元格。

问题陈述:

现在,我想要显示一个弹出窗口,它应该恰好适合所选的单元格,并且箭头指向左侧的单元格。

我做了什么:

1)创建了PopUpViewController.m/.h 2)创建了一个"呈现为popover"从单元格切换到此popUpViewController 3)故事板中的当前锚点设置为tableview,因此弹出窗口从左上角显示。

经过一些阅读,

1)我为单元格创建了一个XTableViewCell.m/.h类 2)在单元格的右端创建一个小按钮,并将其出口放在XTableViewCell.h文件中,以使用此按钮作为锚点。

我的问题是,我在故事板中完成了所有这些。

将我的tableViewController课程视为YTableViewController.h/.m

1)我应该在何处以及如何使用锚点按钮来固定我的弹出窗口?

2)默认情况下,在故事板中,锚点设置为单元格名称。它会被我的按钮覆盖吗?

3)我应该在哪里配置UIPopoverPresentationController参数?

4)如何将弹出窗口显示为" popup"在iPhone中也不是全屏视图控制器?

请帮忙。

1 个答案:

答案 0 :(得分:1)

首先,您应该在视图控制器中创建一个包含表视图的popover segue。您可以通过控制从文档大纲中的黄色视图控制器图标拖动到要弹出的视图控制器来执行此操作。通过单击segue并打开属性检查器并将其添加到segue标识符字段,为其提供segue标识符。像“Popover”这样的东西现在都可以使用。

接下来,您应该从segue标识符字段下方的锚视图圈拖动到视图控制器的视图(稍后我们将在代码中对其进行调整)。

您应该在UITableViewCell子类中添加一个按钮。然后在cellForRowAtIndexPath:中,您可以为按钮添加目标,如:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *cellIdentifier = [menuItems objectAtIndex:indexPath.row]; // I'm not sure what's going on here but hopefully you do
    RegisterTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    [cell.PopoverAnchorButton addTarget:self action:@selector(presentPopover:) forControlEvents:UIControlEventTouchUpInside];

    // Configure the cell...
    return cell;

}

presentPopover:方法添加到视图控制器:

- (void) presentPopover:(UIButton *)sender
{
    [self performSegueWithIdentifier:@"Popover" sender:sender];
}

现在,您可以在视图控制器的prepareForSegue:

中更改源视图

您可以获得对UIPopoverPresentationController的引用,并检查源视图是否是UITableViewCell子类的实例。如果是这样,请将源视图调整为其按钮。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Popover"] && segue.destinationViewController.popoverPresentationController) {
        UIPopoverPresentationController *popController = segue.destinationViewController.popoverPresentationController;
        popController.sourceView = sender;
        popController.delegate = self;
        // if you need to pass data you can access the index path for the cell the button was pressed by saying the following
        CGPoint location = [self.tableView convertPoint:sender.bounds.origin fromView:sender];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
        // do something with the indexPath
    }
}

如果您希望视图控制器始终显示为弹出窗口,即使在实现UIPopoverPresentationControllerDelegate方法时也是如此:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
    return UIModalPresentationStyleNone;
}

此时,您可能会收到警告。这可以通过告诉编译器您符合UIPopoverPresentationControllerDelegate协议来沉默。例如:

@interface MyTableViewController () <UITableViewDataSource, UITableViewDelegate,UIPopoverPresentationControllerDelegate>