gpt4 book ai didi

view - 使用 xib 创建自定义 View

转载 作者:行者123 更新时间:2023-12-04 10:55:04 28 4
gpt4 key购买 nike

使用 MonoTouch,我正在尝试创建自定义 View ,以便我可以在屏幕中多次重复使用该 View 。 (这是一堆标签和按钮)
阅读这篇文章的答案后:
How to add a custom view to a XIB file defined view in monotouch
我必须接近,但这似乎只允许我添加在 myCustomView.CS 中定义的自定义 View ,但我正在寻找的是一种使用单独的 .XIB 来设计我的自定义 View 的方法。 builder 并且只使用相应的 cs-file 来添加逻辑。
如果我尝试使用相同的名称创建 XIB,则内容将不可见。

遵循的步骤:

  • 在 MyCustomView.CS 中,我放置了 [Register("MyCustomView")] .
  • 我实现了构造函数 public MyView(IntPtr handle) : base(handle) {}
  • 在 Interface Builder 中打开 ViewController.XIB,添加一个 UIView 并将它的 Class 设置为 MyCustomView。

  • 当我运行这段代码时,我看到了新添加的 UIView,但没有看到 View 内部的元素,即 MyCustomView.XIB 的内容

    如果我在 MyCustomView.CS 的代码中添加一些东西,比如 this.Backgroundcolor = UIColor.Blue;这会显示,但添加到 .XIB 的任何元素都不会显示。我如何告诉 Monotouch 显示 MyCustomView.XIB 中定义的所有内容?

    在 Objective-C 示例中,我看到诸如“initWithNib”之类的东西
    不幸的是,Monotouch api 中没有记录“LoadNib”部分,但这听起来像是我应该做的事情,但是如何以及在哪里做?

    最佳答案

    一个非常好的问题,但更多的是关于 XIB 的工作方式以及我们可以做些什么。

    问题是当您将一个对象添加到 XIB 并将其设置为自定义类时,您只需指示 UIKit 创建此对象的实例。您在 IB 中看到的作为 View 、按钮或任何控件的事实正是 IB 为您绘制它的方式。这样,创建前景的责任就完全落在了你的类(class)身上。

    在 Objective-C 中,我们可以通过设置添加 View 的类名来做一个很好的欺骗,让 XIB 具有自定义 View ,并且仍然将它们添加到 IB。这是可能的,因为您可以从 Objective-C 中类的 -init 方法返回任何实例,而这在 C# 中是不可能的。

    但是,您仍然可以通过执行以下操作来减轻生活负担:

  • 让我们定义 XIB 成为包含自定义 View 内容的 XIB; 安置成为您想要添加自定义 View 的 XIB。
  • 创建您的自定义 View 类和一个 XIB 来放置它的内部结构
  • 处理 AwakeFromNib 方法以实际加载您的 XIB
  • 加载您的 XIB 后,只需将它的内部结构作为 subview 添加到您的实例中。
  • 放置一个常规 View 并将它的类设置为您自己的 安置
  • 享受!

  • 但是,您必须接受您的 XIB 将包含一个根 View 或其他内容,将添加 作为 subview 放到你的类的实例上,放入 安置 .

    这样,你应该有类似的东西:

    XIB 与您的自定义 View 内容:

    XIB with your custom view contents

    添加 XIB 的位置:

    Placement where you add your XIB

    由于添加到您的展示位置的 View 实例是 相同 作为您的 XIB 中的文件所有者,您可以在 中设置导出和操作两者 XIB 和安置。只是不要忘记您的 XIB 中的根 View 不是 UIKit 将创建以放置到 Placement 中的实例。

    为方便起见,请在下面找到我的代码,它是基类以简化此类 View 的创建:
    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);
    }

    }
    }

    关于view - 使用 xib 创建自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11188634/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com