如何从UITableViewCell.accessoryView调用PopOver控制器?

时间:2010-05-12 22:53:46

标签: objective-c uitableview ipad uipopovercontroller

首先我想说的是我对ipad / ipod / iphone的开发,以及Objective-c的新手。

话虽如此,我正在尝试开发一个针对iPad的小应用程序,使用Xcode和IB,基本上,我有一个表,对于表中的每个UITableViewCell,我添加到accessoryView一个包含一个按钮的按钮图像。

以下是代码:

UIImage *img = [UIImage imageNamed:@"myimage.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake(0.0, 0.0, img.size.width, img.size.height);
button.frame = frame;   // match the button's size with the image size

[button setBackgroundImage:img forState:UIControlStateNormal];

// set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;

到目前为止,非常好,现在问题是当用户点击单元的accessoryView上的按钮时,我想要一个PopOver控件出现。

我在tableView的“accessoryButtonTappedForRowWithIndexPath”上尝试了这个:

UITableViewCell *cell = [myTable cellForRowAtIndexPath:indexPath];
UIButton *button = (UIButton *)cell.accessoryView;

//customViewController is the controller of the view that I want to be displayed by the PopOver controller
customViewController = [[CustomViewController alloc]init];

popOverController = [[UIPopoverController alloc]
initWithContentViewController: customViewController];

popOverController.popoverContentSize = CGSizeMake(147, 122);

CGRect rect = button.frame;

[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

这段代码的问题是它在应用程序View的顶部显示了Popover,而调试时我看到了“rect”的值,它们是:

x = 267
y = 13

所以我认为很明显为什么PopOver会在视图中显示出来,所以我的问题是,如何才能让PopOver的正确值显示在单元的accessoryView上的按钮下方?

另外,正如你所看到的,我告诉它使用“cell.accessoryView”作为“inView:”属性,这样可以吗?

3 个答案:

答案 0 :(得分:8)

尝试使用button.bounds代替button.frame,因为rect是相对inView的。

另请注意,如果单元格位于屏幕底部附近,则弹出窗口可能无法以正确的大小显示,因为您正在向上方向强制箭头。你应该手动处理这个,或者只使用Any。

答案 1 :(得分:1)

[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

将inView:cell.accessoryView更改为inView:cell

答案 2 :(得分:1)

这里是swift:

let cell = tableView.cellForRowAtIndexPath(indexPath)
let rect = tableView.convertRect(tableView.rectForRowAtIndexPath(indexPath), toView: tableView)


    var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("loadZone") as! UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)

    nav.modalPresentationStyle = UIModalPresentationStyle.Popover

    var popover = nav.popoverPresentationController

    popoverContent.preferredContentSize = CGSizeMake(100,200)
    popover!.sourceView = tableView
    popover!.sourceRect = rect

    self.presentViewController(nav, animated: true, completion: nil)

enter image description here