OStack程序员社区-中国程序员成长平台

标题: ios - UITableviewcell 的弹出窗口不起作用 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 16:52
标题: ios - UITableviewcell 的弹出窗口不起作用

我有 6 个单元格的动态 tableview

问题陈述:

现在,我想显示一个弹出框,它应该正好出现在所选单元格的右侧,并且箭头向左指向单元格。

我做了什么:

1) 创建了 PopUpViewController.m/.h
2) 创建了一个从单元格到此 popUpViewController 的“Present as popover”segue。
3) 目前 Storyboard 中的 anchor 设置为 tableview,因此弹出框从左上角显示。

看完之后,

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

我的问题是,我已经在 Storyboard 中完成了所有这些。

将我的 tableViewController 类视为 YTableViewController.h/.m

1) 我应该在哪里以及如何使用 anchor 按钮将我的弹出框锚定到我的要求?

2) 默认情况下, Storyboard中的 anchor 设置为单元格名称。它会被我的按钮覆盖吗?

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

4) 如何在 iPhone 中将弹出窗口显示为“弹出窗口”而不是全屏 View Controller ?

请帮忙。



Best Answer-推荐答案


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

接下来,您应该从 segue 标识符字段下方的 anchor View 圈拖动到您的 View Controller 的 View (我们稍后会在代码中对此进行调整)。

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

- (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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 actionselector(presentPopover forControlEvents:UIControlEventTouchUpInside];

    // Configure the cell...
    return cell;

}

presentPopover: 方法添加到您的 View Controller :

- (void) presentPopoverUIButton *)sender
{
    [self performSegueWithIdentifier"opover" sender:sender];
}

现在,您可以在 View Controller 的 prepareForSegue:

中更改源 View

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

- (void) prepareForSegueUIStoryboardSegue *)segue senderid)sender
{
    if ([segue.identifier isEqualToString"opover"] && 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
    }
}

如果您希望 View Controller 即使在实现 UIPopoverPresentationControllerDelegate 方法时也始终显示为弹出框:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationControllerUIPresentationController *)controller{
    return UIModalPresentationStyleNone;
}

此时,您可能会收到警告。这可以通过告诉编译器你符合 UIPopoverPresentationControllerDelegate 协议(protocol)来消除。例如:

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

关于ios - UITableviewcell 的弹出窗口不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617452/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4