我有 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-推荐答案 strong>
首先,您应该从您的 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/
|