2012-10-30 4 views
2

저는 IOS와 Monotouch에 익숙하지 않지만 .NET과 C#에 능숙합니다. UIButton이 이벤트에 응답하지 않아 그 이유를 알 수 없습니다. MonoTouch로 프로그래밍하는 데 적어도 3 권의 교과서를 읽었으며 stackoverflow 및 다른 사이트에서 많은 질문과 답변을 읽었지만 해결책을 찾지 못했습니다. 내가 ID를 얻기 위해있는 UIButton을 서브 클래스하고 코드는 다음과 같습니다내 UIButton이 응답하지 않는 이유는 무엇입니까?

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을 활성화하면 트릭을 수행 할 수 있지만 내 경우는 그렇지 않다고 읽었습니다.

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

여기 손실을 조금있어 정말 도움이 아니면 다만 힌트처럼 어떤 방향으로 내가 가야 할 :이 사용하는 사용자 지정있는 UIButton (smallDottedMonthButtonNr1을 명명 한) 방법이다.

종류는 버튼이 추가되는 경우의 조나스

+0

UIButton을 서브 클래스화할 때 매우 이상한 동작을 얻습니다. (인스턴스화하고 속성을 직접 설정하는 것이 아니라). 하위 클래스를 만들지 않으면 어떻게됩니까? 같은 문제가 있습니까? –

+0

안녕하세요 Kirk, 이제는 UIButton을 하위 클래스로 만들지 않고 대신 속성을 인스턴스화하고 "정상적인"방식으로 설정하도록 코드를 정렬했습니다. – Jonas

+0

그러나 문제는 계속되고 단추는 계속 응답하지 않습니다. IOS 및 MonoTouch를 이해 했으므로 다른보기 내부에보기가있을 수 있습니다. 따라서 Main 및 AppDelegate를 통해 시작되는 "기본"보기 내부의보기에 단추가있는보기를 첨부했습니다. 이것이 문제가 될 수 있습니까? 아니면 다른 방법으로 생각해야합니까? – Jonas

답변

0

확인 경계/프레임 간주한다. 비록 그것의 scrollView, 그래서 당신이 당신의 버튼을 잘 볼 수있을 것 같아요.

전혀

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

도움에 중단 점을 넣어합니까?

다른보기가 버튼을 덮고 있는지 100 % 확실합니까?

또한 호기심 때문에 TouchUpInside가 아닌 TouchDown을 사용해보십시오.

관련 문제