无法将UIKit.UIView转换为输入UIKit.UILabel?

时间:2015-07-31 11:51:34

标签: ios xamarin

在我的项目中,我试图在视图中获得对标签的引用。视图中有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的样子:

The Parent View

1 个答案:

答案 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);
        }

运行,您应该会在自定义视图中看到更新标签。