从DetailDisclosureButton显示一个UIPopoverController,它通过设置Cell.Accessory添加

时间:2012-10-07 12:56:58

标签: xamarin.ios uipopovercontroller monotouch.dialog uitableview

我有一个UITableView,我在Xamarin的this tutorial中演示了相同的方式。

根据示例中的说明,我在cell.Accessory方法中将DetailDisclosureButton设置为GetCell,如下所示:

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
     (Some code to create/style the cell, etc. See tutorial link.)
     cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;
}

我希望UIPopoverController显示何时点击DetailDisclosureButton。它的锚需要“附加”到按钮上。

为了做到这一点,我需要相应地更改AccessoryButtonTapped方法,如下所示:

public override void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath)
{
        uipoc = new UIPopoverController(uivc);
        uipoc.PopoverContentSize = new SizeF(200f, 300f);
        uipoc.PresentFromRect (tableView.CellAt (indexPath).AccessoryView.Frame, tableView, UIPopoverArrowDirection.Right, true);
}

Uipoc是一个类变量,(仍为空)UIViewController uivc也是如此。

据我所知,PresentFromRect的第一个参数决定了UIPopoverController'挂钩'的UIView,它需要该视图的Frame属性才能这样做。

不幸的是,我上面的方式不起作用。 cell.AccessoryView始终为空,即使我已将cell.Accessory设置为DetailDisclosureButton

答案listed here表示设置cell.Accessory不会影响cell.AccessoryView属性(我知道它涉及ObjectiveC,但我认为同样适用于MonoTouch)。

相反,建议您通过将DetailDisclosureButton分配给UIButton来手动添加cell.AccessoryView。但是,这意味着我不能使用Xamarin示例中的AccessoryButtonTapped方法,需要创建自己的事件处理程序,依此类推。

作为替代方案,我尝试在单元格的Subviews中循环,并像这样连接popovercontroller:

uipoc.PresentFromRect (tableView.CellAt(indexPath).Subviews[1].Frame, tableView, UIPopoverArrowDirection.Right, true);

但是,使用Subviews[0]Subviews[2],它根本不起作用,而Subviews[1]给我带来奇怪的结果 - 弹出菜单始终显示在第一个单元格的旁边{{表格中的1}},无论是哪个单元格的按钮都被点击。

我的问题: 如果仅将DetailDisclosureButton设置为DetailDisclosureButton,是否有办法获取cell.Accessory的视图(ergo,附件的视图)?

如果没有,后一种解决方案(手动添加UITableViewCellAccessory.DetailDisclosureButton)是实现我想要的唯一方法吗?我怎么能在C#/ MonoTouch中做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:2)

经过一番摆弄后,我发现了一个有点丑陋却又有效的解决方法:

public override void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath)
{
    uipoc = new UIPopoverController(uivc);
    uipoc.PopoverContentSize = new SizeF(200f, 300f);
    uipoc.PresentFromRect (new RectangleF(cell.Frame.Right - 40f, cell.Frame.Y, cell.Frame.Width, cell.Frame.Height), tableView, UIPopoverArrowDirection.Right, true);
}

我只需使用Frame本身的信息并从右侧减去40,而不需要来自附件cell的位置信息。这将显示该单元格中UIPopupViewcontroller左侧的DetailDisclosureButton,其箭头指向该单元格。显然,您需要为正确的维度减去(或添加)40,具体取决于您选择的UIPopoverArrowDirection

我怀疑这是正确的方法,但我想我会坚持下去,除非有人提出更好的建议。