저는 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을 명명 한) 방법이다.
종류는 버튼이 추가되는 경우의 조나스
UIButton을 서브 클래스화할 때 매우 이상한 동작을 얻습니다. (인스턴스화하고 속성을 직접 설정하는 것이 아니라). 하위 클래스를 만들지 않으면 어떻게됩니까? 같은 문제가 있습니까? –
안녕하세요 Kirk, 이제는 UIButton을 하위 클래스로 만들지 않고 대신 속성을 인스턴스화하고 "정상적인"방식으로 설정하도록 코드를 정렬했습니다. – Jonas
그러나 문제는 계속되고 단추는 계속 응답하지 않습니다. IOS 및 MonoTouch를 이해 했으므로 다른보기 내부에보기가있을 수 있습니다. 따라서 Main 및 AppDelegate를 통해 시작되는 "기본"보기 내부의보기에 단추가있는보기를 첨부했습니다. 이것이 문제가 될 수 있습니까? 아니면 다른 방법으로 생각해야합니까? – Jonas