2

我对 IOS 和 Monotouch 比较陌生,但精通 .NET 和 C#。UIButton 没有响应事件,我不知道为什么。我已经阅读了至少 3 本关于 MonoTouch 编程的教科书,并在 stackoverflow 和其他网站上阅读了许多问题和答案,但没有找到解决方案。我对 UIButton 进行了子类化以获取 id,代码为:

using System;
using MonoTouch.UIKit;
using System.Drawing;

namespace Roombler.Views
{
    public class SmallDottedMonthButton : UIButton
    {       

        public SmallDottedMonthButton(int numberOfButton)
        {
            this.number = numberOfButton;
            UIImage image = UIImage.FromFile("Green.png");

            this.SetBackgroundImage(image, UIControlState.Normal);
        }

        public int number = 0;


    }
}

然后在视图中使用此代码。该按钮显示正确,但我无法将任何事件附加到它。我读到启用 userInteraction 可以解决问题,但在我的情况下不是。这是使用自定义 UIButton(名为 smallDottedMonthButtonNr1)的方式:

using System;
using MonoTouch.UIKit;
using System.Drawing;
using Roombler.Controllers;

namespace Roombler.Views
{
    public class MonthSelectorView:  UIView
    {
        public UILabel currentYearLabel;
        public UILabel containerForDetailedWeeksLabel;

        public SmallDottedMonthButton  smallDottedMonthButtonNr1;
        public SmallDottedMonthButton smallDottedMonthButtonNr2;

        public NormalDottedMonthButton normalDottedMonthButtonNr1;
        public NormalDottedMonthButton normalDottedMonthButtonNr2;
        public NormalDottedMonthButton normalDottedMonthButtonNr3;

        public WeekButton weekButtonNr1;
        public WeekButton weekButtonNr2;
        public WeekButton weekButtonNr3;
        public WeekButton weekButtonNr4;
        public WeekButton weekButtonNr5;
        public WeekButton weekButtonNr6;

        public NormalMonthButton normalMonthButtonNr1;
        public NormalMonthButton normalMonthButtonNr2;
        public NormalMonthButton normalMonthButtonNr3;

        public SmallMonthButton smallMonthButtonNr1;
        public SmallMonthButton smallMonthButtonNr2;

        private UIScrollView baseView;

        private DateTime currentMonth;

        public MonthSelectorView()
        {
            this.UserInteractionEnabled = true;
            smallDottedMonthButtonNr1 = new SmallDottedMonthButton(1);
            //smallDottedMonthButtonNr1.SetNumberOfButton(1);

            smallDottedMonthButtonNr2 = new SmallDottedMonthButton(2);
            //smallDottedMonthButtonNr2.SetNumberOfButton(2);

            normalDottedMonthButtonNr1 = new NormalDottedMonthButton(1);

            normalDottedMonthButtonNr2 = new NormalDottedMonthButton(2);

            normalDottedMonthButtonNr3 = new NormalDottedMonthButton(3);

            weekButtonNr1 = new WeekButton();
            weekButtonNr1.SetNumberOfButton(1);

            weekButtonNr2 = new WeekButton();
            weekButtonNr2.SetNumberOfButton(2);

            weekButtonNr3 = new WeekButton();
            weekButtonNr3.SetNumberOfButton(3);

            weekButtonNr4 = new WeekButton();
            weekButtonNr4.SetNumberOfButton(4);

            weekButtonNr5 = new WeekButton();
            weekButtonNr5.SetNumberOfButton(5);

            weekButtonNr6 = new WeekButton();
            weekButtonNr6.SetNumberOfButton(6);

            normalMonthButtonNr1 = new NormalMonthButton(1);

            normalMonthButtonNr2 = new NormalMonthButton(2);

            normalMonthButtonNr3 = new NormalMonthButton(3);

            smallMonthButtonNr1 = new SmallMonthButton(1);
            smallMonthButtonNr2 = new SmallMonthButton(2);

            baseView = new UIScrollView {
                Frame = setSizeAndPosition(10.0f, 0.0f, 780.0f, 50.0f),
                BackgroundColor = UIColor.DarkGray,
                AutoresizingMask = UIViewAutoresizing.FlexibleWidth
            };
            this.AddSubview(baseView);

            baseView.UserInteractionEnabled = true;

            currentYearLabel = new UILabel(new RectangleF(5.0f, 5.0f, 100.0f, 40.0f));
            currentYearLabel.Text = "2012";
            currentYearLabel.BackgroundColor = UIColor.Brown;
            currentYearLabel.TextColor = UIColor.White;
            currentYearLabel.TextAlignment = UITextAlignment.Center;
            baseView.AddSubview(currentYearLabel);


            SizeF size = setSize(40.0f, 40.0f);
            DateTime date = currentMonth;
            date = date.AddMonths(1);
            constants = new MonthConstants();

            month = constants.GetNameOfMonth(date.Month, true);

            smallDottedMonthButtonNr1.SetTitle(month, UIControlState.Normal);
            smallDottedMonthButtonNr1.Font = UIFont.FromName("Arial", 8f);
            smallDottedMonthButtonNr1.Frame = new RectangleF(100.0f, 15.0f, 40, 40);
            smallDottedMonthButtonNr1.BackgroundColor = UIColor.White;
            smallDottedMonthButtonNr1.SetTitleShadowColor(UIColor.Green,         UIControlState.Normal);
            smallDottedMonthButtonNr1.SetTitleColor(UIColor.Black, UIControlState.Normal);



            baseView.AddSubview(smallDottedMonthButtonNr1);

            smallDottedMonthButtonNr1.TouchUpInside += HandleTouchUpInside;


            addNormalDottedButton(normalDottedMonthButtonNr1, new PointF(160.0f, 20.0f));
            addNormalDottedButton(normalDottedMonthButtonNr2, new PointF(180.0f, 20.0f));
            addNormalDottedButton(normalDottedMonthButtonNr3, new PointF(200.0f, 20.0f));

            containerForDetailedWeeksLabel = new UILabel(new RectangleF(220.0f, 20.0f, 100.0f, 20.0f));


            addWeekButton(weekButtonNr1.GetButton(1), new PointF(230.0f, 20.0f));
            addWeekButton(weekButtonNr2.GetButton(2), new PointF(240.0f, 20.0f));
            addWeekButton(weekButtonNr3.GetButton(3), new PointF(250.0f, 20.0f));
            addWeekButton(weekButtonNr4.GetButton(4), new PointF(260.0f, 20.0f));
            addWeekButton(weekButtonNr5.GetButton(5), new PointF(270.0f, 20.0f));
            addWeekButton(weekButtonNr6.GetButton(6), new PointF(280.0f, 20.0f));

            addNormalMonthButton(normalMonthButtonNr1, new PointF(310.0f, 20.0f));
            addNormalMonthButton(normalMonthButtonNr2, new PointF(370.0f, 20.0f));
            addNormalMonthButton(normalMonthButtonNr3, new PointF(430.0f, 20.0f));

            addSmallMonthButton(smallMonthButtonNr1, new PointF(490.0f, 20.0f));
            addSmallMonthButton(smallMonthButtonNr2, new PointF(540.0f, 20.0f));

            this.AddSubview(containerForDetailedWeeksLabel);


            UISlider weekOrMonthSlider;

            weekOrMonthSlider = new UISlider { Frame = new RectangleF (500, 500,
                                                             100, 50) };

            weekOrMonthSlider.MinValue = 0.0f;
            weekOrMonthSlider.MaxValue = 20.0f;
            weekOrMonthSlider.SetValue(10.0f, false);

            weekOrMonthSlider.ValueChanged += delegate
            {
                //_text = _slider.Value.ToString ();
                //_testLabel.Text = _text;
            };
            this.AddSubview(weekOrMonthSlider);


        }
        void HandleTouchUpInside(object sender, EventArgs e)
        {
            smallDottedMonthButtonNr1.SetTitle("Test", UIControlState.Normal);
        }


        private RectangleF setSizeAndPosition(float x, float y, float width, float hight)
        {
            return new RectangleF(x, y, width, hight); 
        }

        private SizeF setSize(float width, float hight)
        {
            return new SizeF(width, hight);

        }

        public void setCurrentMonth(DateTime currentMonth)
        {
            this.currentMonth = currentMonth;
        }

        String month;
        MonthConstants constants;

        private SmallDottedMonthButton addSmallDottedButton(SmallDottedMonthButton button, PointF position)
        {


            SizeF size = setSize(40.0f, 40.0f);
            DateTime date = currentMonth;
            date = date.AddMonths(button.number);
            constants = new MonthConstants();

            month = constants.GetNameOfMonth(date.Month, true);

            button.SetTitle(month, UIControlState.Normal);
            button.Font = UIFont.FromName("Arial", 8f);
            button.Frame = new RectangleF(position, size);
            button.BackgroundColor = UIColor.White;
            button.SetTitleShadowColor(UIColor.Green, UIControlState.Normal);

            baseView.AddSubview(button);
            return button;

        }

        private void addNormalDottedButton(NormalDottedMonthButton button, PointF position)
        {
            SizeF size = setSize(50.0f, 50.0f);

            DateTime date = currentMonth;
            date = date.AddMonths(button.number);
            month = constants.GetNameOfMonth(date.Month, true);

            button.SetTitle(month, UIControlState.Normal);
            button.Frame = new RectangleF(position, size);
            button.BackgroundColor = UIColor.White;
            button.SetTitleShadowColor(UIColor.Green, UIControlState.Normal);
            baseView.AddSubview(button);
        }

        private void addWeekButton(WeekButton button, PointF position)
        {
            SizeF size = setSize(35.0f, 35.0f);

            DateTime date = currentMonth;
            date = date.AddMonths(button.number);
            month = constants.GetNameOfMonth(date.Month, true);

            button.SetTitle(month, UIControlState.Normal);
            button.Frame = new RectangleF(position, size);
            button.BackgroundColor = UIColor.White;
            button.SetTitleShadowColor(UIColor.Green, UIControlState.Normal);
            baseView.AddSubview(button);
        }

        private void addNormalMonthButton(NormalMonthButton button, PointF position)
        {
            SizeF size = setSize(50.0f, 50.0f);
            DateTime date = currentMonth;
            date = date.AddMonths(button.number);

            month = constants.GetNameOfMonth(date.Month, true);

            button.SetTitle(month, UIControlState.Normal);
            button.Frame = new RectangleF(position, size);
            button.BackgroundColor = UIColor.White;
            button.SetTitleShadowColor(UIColor.Green, UIControlState.Normal);
            baseView.AddSubview(button);
        }

        private void addSmallMonthButton(SmallMonthButton button, PointF position)
        {

            SizeF size = setSize(40.0f, 40.0f);

            DateTime date = currentMonth;
            date = date.AddMonths(button.number);
            month = constants.GetNameOfMonth(date.Month, true);

            button.SetTitle(month, UIControlState.Normal);
            button.Frame = new RectangleF(position, size);
            button.BackgroundColor = UIColor.White;
            button.SetTitleShadowColor(UIColor.Green, UIControlState.Normal);
            baseView.AddSubview(button);
        }
    }
}

我在这里有点迷路,真的很想得到一些帮助,或者只是提示我应该往哪个方向走。

亲切的问候乔纳斯

4

1 回答 1

0

检查按钮添加到的边界/框架。虽然它是一个滚动视图,所以我想如果你能看到你的按钮就很好。

是否设置断点

    smallDottedMonthButtonNr1.SetTitle("Test", UIControlState.Normal);

有帮助吗?

您是否 100% 确定没有其他视图覆盖您的按钮?

另外,出于好奇,请尝试 TouchDown 而不是 TouchUpInside。

于 2012-11-15T05:41:22.983 回答