我有一个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中做到这一点?
谢谢!
答案 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
。
我怀疑这是正确的方法,但我想我会坚持下去,除非有人提出更好的建议。