使用MonoTouch的,我试图做一个自定义视图,这样我就可以在画面中多次重复使用这一观点。 (这是一堆标签和按钮的)阅读的答案,这个帖子后: 如何自定义视图添加到XIB文件中定义的视图中的MonoTouch我一定会越来越近,但这似乎只允许我添加自定义视图,所述的在myCustomView.CS,但我正在寻找的是使用单独的.xib来设计我的自定义视图界面中的建设者和仅使用相应的CS-文件添加逻辑的方法。 如果我努力使具有相同名称的厦门国际银行,该内容将不会变得可见。
其次步骤:
在MyCustomView.CS我已经把[Register("MyCustomView")]
我实现了构造public MyView(IntPtr handle) : base(handle) {}
在Interface Builder打开ViewController.XIB,添加一个UIView,并设置它的类来MyCustomView。
当我运行这段代码,我看到新添加的UIView,但不是视图里面的元素,即MyCustomView.XIB的内容
如果我添加了一些MyCustomView.CS的代码,例如this.Backgroundcolor = UIColor.Blue;
这显示,但加入的.xib的任何元件都没有。 我如何告诉MonoTouch的显示内MyCustomView.XIB定义的所有的东西?
在Objective-C的样品我看到的东西,如“initWithNib”不幸的是在MonoTouch的API的“LoadNib”部分未记录在,但听起来就像是我应该做的,但如何以及在何处?
一个非常非常好的问题,但它更多的是XIBs是如何工作的,以及我们能做些什么。
问题是,当你添加一个对象到厦门国际银行,并将其设置为自定义类的,你只是指示的UIKit创建该对象的实例。 您在IB看到的视图,一个按钮或whateverish控制的事实是IB只是如何吸引它。 通过这种方式创建的前景的责任完全落在你的类。
在Objective-C,我们可以做一个很好的作弊方式有自定义视图XIBs,仍然通过设置添加视图的类名称将它们添加到IB。 这是可能的,因为你可以从你的Objective-C类,这是不可能的C#的-init方法返回任何实例。
但是,您仍然可以通过执行以下操作简化你的生活:
- 让我们来定义XIB是包含自定义视图的内容XIB; 安置是要你添加自定义视图中的厦门国际银行。
- 您创建自定义视图类和XIB奠定了它的内部
- 处理AwakeFromNib方法实际加载您的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);
}
}
}
根据我的OBJ-C代码的经验,我会尝试下面的代码:
var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1)
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2)
(1)允许您加载的厦门国际银行文件
(2),可以转换为一个IntPtr转换成适当类型NSObject的(子)型。
一旦你有myView
,你可以将它列为一个传统观点。 请检查您是否已经为您的视图中的outelt正确。
PS如果你提供一些其他细节,我们可以帮助你。 此外,检查代码,因为我已经是手写。
取而代之的是笔尖文件,你可以用一个容器视图,使其简单。 你可以尝试像这样。