动态创建的Xamarin iOS UI按钮无法点击

时间:2017-02-07 22:00:27

标签: ios xamarin mvvmcross

我有一个从nib文件中膨胀的Tag类:

using Foundation;
using System;
using UIKit;
using ObjCRuntime;

namespace TagTest
{
public partial class Tag : UIView
{

    public Tag (IntPtr handle) : base (handle)
    {
    }

    public static Tag Create()
    {

        var arr = NSBundle.MainBundle.LoadNib("Tag", null, null);
        var v = Runtime.GetNSObject<Tag>(arr.ValueAt(0));

        return v;
    }

    public override void AwakeFromNib()
    {
    }

    public UIButton Hashtag
    {
        get
        {
            return HashtagBtn;
        }
    }

    public UILabel HashtagCount
    {
        get
        {
            return HashtagCountLbl;
        }
    }
}

}

由以下viewmodel

使用
using System.Collections.Generic;
using MvvmCross.Binding.BindingContext;
using MvvmCross.iOS.Views;
using TagTest.Core.ViewModels;
using UIKit;
using Cirrious.FluentLayouts.Touch;
using System;
using System.Drawing;

namespace TagTest
{
public partial class SearchView : MvxViewController
{

    List<Tag> _tags;

    public SearchView () : base ("SearchView", null)
    {
    }

    new SearchViewModel ViewModel
    {
        get
        {
            return (SearchViewModel)base.ViewModel;
        }
        set
        {
            base.ViewModel = value;
        }
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        DisplayTags();

        View.UserInteractionEnabled = false;

        View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
        View.TranslatesAutoresizingMaskIntoConstraints = false;
        EdgesForExtendedLayout = UIRectEdge.None;
        ExtendedLayoutIncludesOpaqueBars = false;
        AutomaticallyAdjustsScrollViewInsets = false;

        View.ClipsToBounds = true;
        View.BackgroundColor = UIColor.Red;

        CreateBindings ();
    }

    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);

        ViewModel.Init();
    }

    void CreateBindings()
    {
        var set = this.CreateBindingSet<SearchView, SearchViewModel> ();
        set.Bind (this).For(x => x.Title).To (vm => vm.Title);
        set.Apply ();
    }

    public override void ViewDidLayoutSubviews()
    {
        base.ViewDidLayoutSubviews();

        View.LayoutIfNeeded();
    }

    void DisplayTags()
    {
        _tags = new List<Tag>();

        if (ViewModel.Tags != null)
        {
            foreach (var item in ViewModel.Tags)
            {
                _tags.Add(Tag.Create());
            }

            UIView lastTemplateAdded = View;

            for (int i = 0; i < _tags.Count; i++)
            {
                var tag = _tags[i];

                tag.TranslatesAutoresizingMaskIntoConstraints = false;
                tag.Hashtag.SetTitle(ViewModel.Tags[i].Tagname, UIControlState.Normal);
                tag.HashtagCount.Text = ViewModel.Tags[i].Count.ToString();
                tag.Frame = new RectangleF(100f, 300f, 100f, 50f);
                tag.Hashtag.Enabled = true;
                tag.Hashtag.UserInteractionEnabled = true;
                tag.UserInteractionEnabled = true;

                tag.Hashtag.TouchUpInside += (sender, e) =>
                {
                    ViewModel.TagSelectedCommand.Execute(tag);
                };

                View.AddSubview(tag);

                if (i == 0)
                {
                    View.AddConstraints(
                    tag.AtTopOf(View),
                    tag.AtLeftOf(View),
                    tag.Height().EqualTo(20)
                    );
                }
                else
                {
                    View.AddConstraints(
                    tag.Below(lastTemplateAdded, 20),
                    tag.AtLeftOf(View),
                        tag.Height().EqualTo(20)
                    );
                }

                lastTemplateAdded = tag;
            }
        }
    }

    public override void DidReceiveMemoryWarning ()
    {
        base.DidReceiveMemoryWarning ();
        // Release any cached data, images, etc that aren't in use.
    }
}

}

但是Hashtag按钮不可点击,TouchupInside似乎没有被触发。如果我向视图添加一个按钮,则可以单击它。可能出现什么问题?

1 个答案:

答案 0 :(得分:0)

发现问题。它是设置View.UserInteractionEnabled = false的组合;并使用流畅的约束。我现在将UserInteractioEnabled设置为true并删除了流畅的约束。一切正常。