使用xib创建自定义视图

8
使用MonoTouch,我正在尝试创建一个自定义视图,以便在屏幕上多次重复使用此视图。(它是一堆标签和按钮)阅读了此帖子的答案后:How to add a custom view to a XIB file defined view in monotouch">(链接1),我必须接近了,但这似乎只允许我添加一个自定义视图,在我的CustomView.CS中定义,但我正在寻找的是一种使用单独的.XIB来设计我的自定义视图的方法,在界面构建器中仅使用相应的cs文件添加逻辑。如果我尝试使用相同名称制作XIB,则内容将不可见。

按照以下步骤操作:

  • 在MyCustomView.CS中,我放置了[Register("MyCustomView")]

  • 我实现了构造函数public MyView(IntPtr handle) : base(handle) {}

  • 在界面构建器中打开ViewController.XIB,添加一个UIView并将其类设置为MyCustomView。

当我运行这段代码时,我看到了新添加的UIView,但是没有看到视图内部的元素,即MyCustomView.XIB的内容。
如果我在MyCustomView.CS的代码中添加一些内容,比如this.Backgroundcolor = UIColor.Blue;,这个颜色会显示出来,但是添加到.XIB中的任何元素都不会。我该如何告诉Monotouch显示在MyCustomView.XIB中定义的所有内容?
在Objective-C示例中,我看到了"initWithNib"之类的东西。不幸的是,在Monotouch api中,"LoadNib"部分没有记录,但那听起来像是我应该做的事情,但是如何以及在哪里?

你能提供一下你用来添加xib视图的代码吗?谢谢。 - Lorenzo B
3个回答

8

根据我在obj-c代码方面的经验,我将尝试以下代码:

var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1)
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2)

(1) 允许您加载xib文件。

(2) 允许您将IntPtr转换为适当类型的NSObject(子)类型。

一旦您有了myView,您可以将其添加为传统视图。检查您是否正确设置了视图的输出。

P.S. 如果您提供其他细节,我们可以帮助您。此外,请检查代码,因为我是手写的。


6
一个非常好的问题,但它更多地涉及XIB的工作原理以及我们可以对其做些什么。
问题在于当您向XIB添加对象并将其设置为自定义类时,您只是指示UIKit创建此对象的实例。您在IB中看到的视图、按钮或任何其他控件实际上只是IB为您绘制的方式。这样,创建外观的责任完全落在您的类上。
在Objective-C中,我们可以通过一个很好的技巧来拥有具有自定义视图的XIB,并仍然通过设置添加的视图的类名将它们添加到IB中。这是可能的,因为您可以从Objective-C的-init方法中返回任何实例,而使用C#是不可能的。
然而,您仍然可以通过执行以下操作来简化您的生活:
1. 让XIB成为包含您自定义视图内容的XIB; 放置是您想要添加自定义视图的XIB。 2. 创建自定义视图类和一个XIB来布局其中的内容 3. 处理AwakeFromNib方法以实际加载您的XIB 4. 在加载完XIB后,将其内部作为子视图添加到您的实例中。 5. 放置一个常规视图并将其类设置为您自己的视图 6. 尽情享受!
但是,您必须接受您的XIB将包含一个根视图或其他内容,该内容将作为子视图添加到放置在Placement中的您的类的实例中。
这样,您应该会得到以下内容:
包含自定义视图内容的XIB: XIB with your custom view contents 添加您的XIB的位置: Placement where you add your XIB 由于添加到放置中的视图实例与您的XIB中的文件所有者相同,因此您可以在两个 XIB和放置中设置输出和操作。只是不要忘记,您XIB中的根视图不是UIKit将创建并放置在放置中的实例。
为方便起见,请在下面找到我的代码,它是用于简化创建此类视图的基类:
using System;

using MonoTouch.ObjCRuntime;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace Member.iOS.Base.Views {

    /// <summary>
    /// XibView is a Xib-backed UIView subclass which enables easy customization and custom
    /// behavior addition.
    /// </summary>
    public class XibView : UIView {

        /// <summary>
        /// Exception thrown when a loaded XIB doesn't contain any views inside it.
        /// </summary>
        class EmptyXibException : Exception {
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="Member.iOS.Base.Views.XibView"/> class.
        /// </summary>
        /// <param name='handle'>
        /// Handle.
        /// </param>
        public XibView(IntPtr handle) : base(handle) {
        }

        /// <summary>
        /// Upon loading from a containing XIB, takes care of replacing the current instance (which acts as a stab) with
        /// a real view loaded from its XIB.
        /// </summary>
        public override void AwakeFromNib() {
            base.AwakeFromNib();

            NSArray views = NSBundle.MainBundle.LoadNib(GetType().Name, this, new NSDictionary());

            if (views.Count == 0) {
                throw new EmptyXibException();
            }

            UIView rootView = Runtime.GetNSObject(views.ValueAt(0)) as UIView;
            rootView.Frame = new System.Drawing.RectangleF(0, 0, Frame.Width, Frame.Height);
            AddSubview(rootView);
        }

    }
}

0

你可以使用容器视图来代替 nib 文件,使其更简单。你可以尝试类似于 this. 的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接