使用带有子类UIViewControllers的MonoTouch不会按预期绑定

时间:2012-05-25 01:59:23

标签: xamarin.ios monodevelop xamarin

我已经尝试过几种不同的方法,但这并没有按预期工作。这是一个混合iOS应用程序,大约一半的屏幕UIViewControllers具有主UIWebView。处理UIWebView事件有很多类似的逻辑,特别是在错误处理方面。子类稍微专门用于处理呈现的屏幕。所以,类图大致是:

UIViewController
  +- BaseWebController   <-- this class should bind to UIWebView
      +-- ScreenAController
      +-- ScreenBController
      +-- ...

BaseWebController.designer.cs非常基本。事实上,一旦连线它看起来像:

[Register ("BaseWebController")]
partial class BaseWebController
{
    [Outlet]
    MonoTouch.UIKit.UIWebView WebView { get; set; }

    void ReleaseDesignerOutlets ()
    {
        if (WebView != null) {
            WebView.Dispose ();
            WebView = null;
        }
    }
}

问题是:我得到了各种异常,因为UIWebView未正确绑定到WebView实例。我收到各种消息,例如'无法在ScreenAController'上找到选择器setWebView,但它归结为(我认为)它正在尝试绑定父类(ScreenAController)并失败。

问题:我是否遗漏了这种绑定应该如何工作的内容?本质上我试图保持这个非常干燥并将所有重复的代码推送到基类。否则,我将最终重复相同的100行连线代码和每个屏幕的错误检查。

TIA。

3 个答案:

答案 0 :(得分:1)

我猜你对继承和绑定的看法是对的,而不是凝胶化。

您可以通过添加以下内容来妥协:

[outlet]
new UIWebView WebView
{
    get { return base.WebView; }
    set { base.WebView = value;}
}

到每个ScreenController类。

不是完全干,但比复制所有课程中的所有内容要好。

答案 1 :(得分:1)

答案 2 :(得分:0)

@Stuart:

右。我的结局与你提到的非常相似。我决定让每个父类(ScreenAController,ScreenBController)绑定到同一个视图并实现由基类定义的抽象属性:

   protected abstract UIWebView ActiveWebView { get; }

该基类在其构造函数中设置xib文件。 ScreenAController,ScreenBController,...,实现该属性,它实际上只是对该出口的引用。它尽可能干涸。这就是你所说的。

    /// <summary>
    /// Provides access to the base class to handle most error handling.
    /// </summary>
    protected override UIWebView ActiveWebView { get { return this.WebView; } }

@mhutch,我会仔细看看那个bug。我现在可以解决这个问题。

谢谢!