我尝试使用UIPopoverPresentationController
。对于演示,我需要指派代理人(UIPopoverPresentationControllerDelegate
)才能使用prepareForPopoverPresentation
,
popoverPresentationControllerDidDismissPopover
等方法。
如果将视图控制器分配给委托属性我得
错误CS0266无法将类型'UIKit.UIViewController'隐式转换为'UIKit.IUIPopoverPresentationControllerDelegate'。存在显式转换(您是否错过了演员?)
那么我的选择是什么?在本地世界,人们可以添加所需的协议,但你不能在Xamarin中这样做。我希望popover中显示的视图控制器获得通知(准备,解散,...)。我怎么能这样做?
当然我可以创建一个UIPopoverPresentationControllerDelegate
的新实例并分配它,但是我会以某种方式将代理与视图控制器连接(例如通过事件)。有更简单的解决方案吗?
答案 0 :(得分:1)
修改强>
看起来Xamarin没有公开WeakDelegate
属性,并且还使委托类成为协议的抽象类而不是接口。在这种情况下 - 您将不得不创建另一个实现UIPopoverPresentationControllerDelegate
的类和另一个实现UIPopoverControllerDelegate
的类。
将来值得注意的是,通常有一个WeakDelegate
属性(以及Delegate
)允许将任何类分配给委托并通过ExportAttribute
隐式实现协议协议方法。 Xamarin有时也使用协议的匹配接口(例如IUIPopoverPresentationControllerDelegate
)而不是匹配的抽象类(UIPopoverPresentationControllerDelegate
类)。
大多数错误的原始回答
您的UIViewController
类应该可以实现IUIPopoverControllerDelegate
并实现您需要的任何方法。通常iOS协议转换为Xamarin.iOS的接口,您可以通过在协议名称后附加“I”来找到它。
public class TestVC : UIViewController, IUIPopoverControllerDelegate
{
public override UIPopoverPresentationController PopoverPresentationController {
get {
return base.PopoverPresentationController;
}
}
[Export ("popoverControllerDidDismissPopover:")]
public void DidDismiss (UIPopoverController popoverController)
{
throw new NotImplementedException ();
}
}
这是一个我已经实现了一些popover方法的例子。我希望这有帮助。我没有明确测试过这个,但我认为它应该可行。如果没有,请告诉我。
答案 1 :(得分:0)
我的解决方案如下:
我已将UIPopoverPresentationControllerDelegate
子类化,此处我定义了事件PrepareForPopover
和DidDismiss
。所以我覆盖了PrepareForPopoverPresentation
和DidDismissPopover
,我抛出了归属事件。
然后我将此委托分配给我的UIPopoverPresentationController
实例。通过订阅我的自定义委托的事件,我可以得到通知,显示弹出窗口和解除时间。铸造是不可能的(正如我在我的问题中尝试过的那样)。
这个可以设置一些变量或从视图控制器中调用一些方法,这些方法在popover中显示。