gpt4 book ai didi

ios - 来自 UITableviewcell 的弹出窗口不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:48 25 4
gpt4 key购买 nike

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

问题陈述:

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

我做了什么:

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 ?

请帮忙。

最佳答案

首先,您应该从您的 View Controller 创建一个带有 TableView 的 popover segue。您可以通过控制从文档大纲中的黄色 View Controller 图标拖动到要弹出的 View Controller 来完成此操作。通过单击 segue 并打开属性检查器并将其添加到 segue 标识符字段,为其提供一个 segue 标识符。 “Popover”之类的东西现在可以使用。

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

您应该向您的 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: 方法添加到您的 View Controller :

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

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

中更改源 View

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

- (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
}
}

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

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com