如何分配UIPopoverPresentationControllerDelegate

时间:2016-01-29 12:02:12

标签: c# ios xamarin delegates xamarin.ios

我尝试使用UIPopoverPresentationController。对于演示,我需要指派代理人(UIPopoverPresentationControllerDelegate)才能使用prepareForPopoverPresentation popoverPresentationControllerDidDismissPopover等方法。

如果将视图控制器分配给委托属性我得

  

错误CS0266无法将类型'UIKit.UIViewController'隐式转换为'UIKit.IUIPopoverPresentationControllerDelegate'。存在显式转换(您是否错过了演员?)

那么我的选择是什么?在本地世界,人们可以添加所需的协议,但你不能在Xamarin中这样做。我希望popover中显示的视图控制器获得通知(准备,解散,...)。我怎么能这样做?

当然我可以创建一个UIPopoverPresentationControllerDelegate的新实例并分配它,但是我会以某种方式将代理与视图控制器连接(例如通过事件)。有更简单的解决方案吗?

2 个答案:

答案 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子类化,此处我定义了事件PrepareForPopoverDidDismiss。所以我覆盖了PrepareForPopoverPresentationDidDismissPopover,我抛出了归属事件。

然后我将此委托分配给我的UIPopoverPresentationController实例。通过订阅我的自定义委托的事件,我可以得到通知,显示弹出窗口和解除时间。铸造是不可能的(正如我在我的问题中尝试过的那样)。

这个可以设置一些变量或从视图控制器中调用一些方法,这些方法在popover中显示。