在我的项目中,我试图在视图中获得对标签的引用。视图中有2个项目,其中两个都是UILabel。
var headerViews = NSBundle.MainBundle.LoadNib(nibName,this,null);
// Only 1 view in the XIB as shown in the image below.
UIView headerView = headerViews.GetItem<UIView>(0);
UILabel nameLabel = (UILabel)headerView.ViewWithTag(1);
这会引发运行时错误,无法将视图强制转换为标签。为什么不?此演员表在Objective-C和Swift中有效。
这就是headerView的样子:
答案 0 :(得分:0)
我建议采用更安全的方法。
创建一个UIView子类,例如MyDialogView在您的XIB设计器中将此类设置为主视图,并为每个控件添加Outlets。 然后添加一个方法,您可以传递要更新View with的模型类或值。 在您的代码中,您可以使用MyDialogView类并调用该方法来使用数据更新视图。
这样您就不需要使用强制转换和标记。
[编辑] 代码示例。
创建一个类并从UIView派生,添加Register属性以使其在XCode中可见。它应该如下所示。
[Register("MyCustomView")]
public partial class MyCustomView : UIView
{
CGSize _intrinsicContentSize;
public UIView View { get; set; }
public string Text {
get { return myLabel.Text; }
set { myLabel.Text = value; }
}
public MyCustomView ()
{
SetupView ();
}
public MyCustomView (IntPtr handle) : base (handle)
{
SetupView ();
}
private UIView LoadViewFromXib()
{
NSBundle bundle = NSBundle.FromClass (this.Class);
UINib nib = UINib.FromName ("MyCustomView", bundle);
return nib.Instantiate (this, null)[0] as UIView;
}
private void SetupView()
{
this.View = LoadViewFromXib ();
AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
this.Bounds = this.View.Bounds;
_intrinsicContentSize = this.Bounds.Size;
TranslatesAutoresizingMaskIntoConstraints = false;
AddSubview (this.View);
}
public override CGSize IntrinsicContentSize {
get {
return _intrinsicContentSize;
}
}
}
在您的XIB文件中,不要将View的类设置为MyCustomView,而将文件的所有者设置为MyCustomView。
在某个地方的ViewController中,例如ViewDidLoad添加以下内容。
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Perform any additional setup after loading the view, typically from a nib.
MyCustomView customView = new MyCustomView ();
customView.Text = "Test Label Text";
Add (customView);
}
运行,您应该会在自定义视图中看到更新标签。