1

我已经通过几种不同的方法进行了尝试,但这并没有按预期工作。这是一个混合 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 实例。我收到各种消息,例如'Failed to find selector setWebView: on ScreenAController',但归结为(我认为)它试图绑定父类(ScreenAController)并失败。

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

TIA。

4

3 回答 3

1

我猜你对继承和绑定不太正确。

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

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

到每个 ScreenController 类。

不是完全 DRY,但比在所有类中复制所有内容要好。

于 2012-05-25T21:58:17.763 回答
1

这看起来像这个错误: https ://bugzilla.xamarin.com/show_bug.cgi?id=1449#c7

于 2012-05-25T22:56:00.093 回答
0

@斯图尔特:

对。我最终到达了与您提到的非常相似的地方。我决定让每个父类(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,我会仔细看看那个错误。我现在可以解决这个问题。

谢谢!

于 2012-05-28T01:06:57.173 回答