2009년 11월 06일
[iPhone][MonoTouch] 여섯번째 예제 : Reaction Time
이번 예제는 너무 늦었습니다. 구현은 저번 달에 해 놓고 오늘에서야 올립니다.
오늘은 AppsAmuck의 6일째 예제인 ReactionTime을 MonoTouch로 구현해 보겠습니다. 이번 예제는 순발력을 측정하는 간단한 게임이라고 할 수 있습니다. 응용에 따라서 다양한 게임 형태가 나올 수 있겠습니다.
1. "ReactionTime" 이름으로 새 솔루션을 만듭니다. 솔루션의 타입은 "iPhone MonoTouch Project"를 선택하는 것을 잊으면 안됩니다.
2. 앞의 예제와 같이 세개의 UIViewController를 사용하도록 하겠습니다. 먼저 뷰 컨트롤러를 넣어 둘 폴더를 "ViewController"이름으로 생성합니다. 첫번째로 어플리케이션의 기본 뷰 컨트롤러로서 역할을 담당할 "RootViewController"를 "View Interface Definition with Controller"유형으로 추가합니다.
메인 화면을 담당할 "MainViewContoller"이름으로 추가합니다.
도움말 화면 뷰를 관리할 "FlipsideViewController"를 추가 합니다. 추가한 세 컨트롤러는 모두 "View Interface Definition Controller"유형으로 하는 것을 잊지 않도록 합니다.
추가 한 후의 솔루션 화면은 아래와 같습니다. "View Interface Definition With Controller"유형으로 생성된 UIViewController는 *.xib파일과 *.xib.cs, *.xib.designer.cs 세가지 파일을 생성해 줍니다.
3. MainWindow.xib파일을 IB(Interface Builder)를 이용하여 열고 "Window"항목 아래에 앞서 추가한 "RootViewController"이름으로 ViewController를 추가합니다.


IB의 Library윈도우에서 "View Controller"를 드래그앤드롭으로 객체 윈도우에 가져나 놓으면 됩니다.
이름을 "RootViewController"로 지정하는 것이 중요합니다.
4. "RootViewController.xib"의 뷰에는 화면 전환을 위해 이용되는 Info버튼을 위치 시킵니다. 우선 Library창에서 "Round Rect Button"을 드래그앤드롭으로 뷰의 적당한 위치에 가져다 놓습니다. 예제에선 우측 하단 부분입니다.
버튼의 속성창에서 타입을 "Info Light"로 변경해 주면 화면과 같은 모양의 버튼을 자동으로 생성해 줍니다.
버튼이 놓여진 뷰의 화면과 객체창 입니다.
"Root View Controller"의 Identity창을 열고 버튼을 참조하기 위한 Outlet과 Action을 추가합니다. Action이름은 "toggleView"로 지정합니다. Outlet은 "infoButton"이름으로 추가합니다.
추가한 Outlet을 버튼 객체와 연결합니다. Action "toggleView"는 버튼의 "Touch Up Inside"이벤트에 연결합니다. 정상적으로 연결을 했다면 아래와 같은 결과가 나와야 합니다.
MainWindow.xib의 "App Delegate" Identity창을 선택합니다. 뷰를 연결하기 위해 Outlet에 "rootViewController"를 추가합니다. 타입은 "RootViewController"로 합니다.
추가한 Outlet "rootViewController"를 실 객체에 연결합니다. 화면과 같습니다.
5. 어플리케이션에 필요한 이미를 솔루션의 리소스로 추가합니다. 아래 이미지들을 다운 받습니다.





파일 이름은 왼쪽부터 각각 "greenLightSmall.png", "gasPedalSmall.png", "redLightSmall.png", "stopLightCable.png", "yellowLightSmall.png", 그리고 배경이 되는 "road.png" 입니다.
컴파일 시에 어플리케이션 디렉토리에 함께 복사 되도록 설정을 변경 해야 합니다. 방법은 각 이미지에서 오른쪽 버튼을 클릭 후에 나오는 메뉴의 "Build Action" 항목 중 "Content"를 설정 하는 것으로 간단히 끝납니다.
6. MainViewController와는 별도로 UIView를 상속한 클래스를 만들어서 개발을 하겠습니다. 파일 추가 메뉴를 이용하여 빈 클래스 파일을 "MainView"이름으로 추가합니다. MainView.cs파일이 생성 됩니다. 코드에 대해선 다음에 자세히 설명 합니다.
꾸며야 할 결과 화면입니다. 참고하여 화면을 구성합니다.
실제 IB에서 작업 하는 경우는 이미지의 경로가 IB와 연동이 안되어 아래와 같이 보입니다. 당황하지 말고 컴파일 옵션 설정이 틀리지 않았다면 실행 시에 정상적으로 보입니다.
MainViewController.xib파일을 IB로 열고 화면 설계를 합니다. 뷰(View)의 클래스를 UIView에서 추가한 MainView로 지정해 줍니다.
뷰의 객체로서 UIImageView 객체 3개와 버튼 객체 1개를 뷰에 가져다 놓고 세부 위치와 크기를 조정합니다. 위치와 좌표는 아래 표를 참고 하세요.
"MainViewController.xib"의 Identity창을 열고 Outlet과 Action을 추가합니다. Outlet "stopLight"은 타이머에 맞게 이미지 변경을 하기 위해 사용할 UIImageView객체입니다. Action "gasPedalPressed"는 사용자의 액션을 받기 위해 버튼의 이벤트를 처리할 함수입니다.
추가한 각 Outlet과 Action을 실제 객체와 연결을 해 줍니다. Action의 이벤트는 "Touch Up Inside"를 연결했습니다.
7. 이번엔 간단한 FlipsideViewController의 뷰를 디자인 합니다. 주의할 사항은 화면에 보시는 것처럼 화면 상단에 "Navigation Bar"가 있다고 가정하고 작업을 해야 합니다. 이를 위해서 뷰의 속성 창을 보시면 "Simulated Interface Elements"항목이 있습니다. 이 속성은 화면 디자인을 위해 미리 특정 요소가 있다는 것을 가정하고 작업할 수 있도록 도와 줍니다. 이번 작업에서는 "Top Bar" 위치에 "Navigation Bar"를 선택합니다. 뷰 화면 상단에 파란색의 "Navigation Bar"가 자리 잡고 있는 것을 확인 할 수 있습니다.
화면 디자인에 들어가는 요소는 UILabel 2개와 UITextView 1개 입니다. 각각을 표와 같이 작업 합니다.
여기까지 필요한 파일들과 화면 디자인을 끝냈습니다. 필요한 코드를 하나씩 작업해 보겠습니다.
8. RootViewController를 메인 윈도우의 서브뷰로서 등록합니다. 이 작업이 없으면 어플리케이션 화면에 아무것도 표시 되지 않습니다. 솔루션 창에서 Main.cs파일을 편집창으로 불러 옵니다. 어플리케이션이 실행된 후에 호출되는 함수 "FinishedLaunching"을 찾아 뷰를 등록합니다. window.AddSubview(UIView view) 함수가 등록하는 역할을 해 줍니다.
"rootViewController"는 화면 설계시에 Outlet으로 등록한 이름으로 코드에서 직접 참조가 가능합니다. "rootViewController.View"는 뷰 컨트롤러의 뷰를 나타내는 변수 입니다. 서브 뷰로서 등록을 했기 때문에 실행 시에 메인 화면에 RootViewController의 뷰를 표시 하게 됩니다.
9. RootViewController.xib.cs에 Action(toggleView)구현 하겠습니다. 역할은 info버튼을 클릭 했을 때 MainViewController와 FlipsideViewController를 화면 전환하는 것입니다. 다른 예제들과 같은 내용입니다. 멤버 변수로 앞에서 추가한 뷰 컨트롤러와 flipsideNavigationBar(UINavigationBar )를 추가합니다.
FlipsideViewController는 실행 초기에는 객체로 생성되어 있지 않기 때문에 toggleView에서 null인지 검사하여 객체를 생성 시켜 주는 "loadFlipsideViewController()"함수를 호출합니다. 이 함수의 역할은 FlipsideViewController를 생성하고 NavigationBar와 필요한 버튼 객체를 추가하는 것입니다. flipsideViewController 뷰의 위치를 NavigationBar 만큼 조정하는 것이
"Navigation Bar"에 MainViewController로 전환하기 위해 버튼(UIBarButtonItem)을 추가했습니다. 버튼이 클릭 되었을 때 호출되는 이벤트 정의를 위해서 delegate를 사용하고 있는 것을(
Action "partial void toggleView (UIButton sender)"에서는 화면 전환에 필요한 UIView 애니메이션 처리를 합니다.
info버튼과 NavigationBar의 "back"버튼을 통해 화면 전환 애니메이션 처리를 해 봤습니다. 앞에서 다뤘던 예제들과 다른게 없는 내용입니다.
10. 이제 실제 내용에 해당하는 MainView.cs에 작업을 해 보겠습니다. "UIAlertView"와 "NSTimer"의 사용 방법과 "Selector"등에 대해서 배울 수 있습니다. 코드를 보겠습니다.
"UIAlertView"를 이용하기 위해 버튼이 눌렸을 때의 이벤트를 처리하기 위해 "UIAlertViewDelegate"를 상속받은 "ClickedAlert" 클래스를 생성했습니다. "Dismissed"이벤트에서 MainView의 "Dismissed"를 호출하도록 되어 있습니다.
MainView입니다. "UIView"에서 상속 받았습니다. 뷰에서 처리할 내용은 타이머가 임의 시간으로 지정되어 동작을 하도록 하고 그때 마다 호출되는 함수에서 화면의 이미지 교체를 합니다. 그리고 사용자로부터 버튼의 터치 이벤트를 받아서 흘러간 시간을 체크하고 "UIAlertView"를 이용하여 메시지를 출력하는 것입니다. 설명은 코드에 첨가한 주석으로 대체합니다.
여기까지입니다. 컴파일 하고 실행 시켜 봅니다. 아래 화면은 각 실행 화면을 캡쳐한 것입니다. 녹색불이 켜졌을 때 발 모양의 패달을 얼마나 빨리 누르는 것으로 순발력 테스트(?)를 해 보실 수 있습니다. 마지막 그림은 info버튼를 눌렀을 때 전환되는 화면입니다.





최근 버젼은 MonoDevelop에서 디버깅을 할 수 있게 되었습니다. 점점 개발이 편하게 되어 가는 군요. 좋은 현상입니다.
다음은 Appsamuck의 7번째 예제에 도전 해 보겠습니다.
오늘은 AppsAmuck의 6일째 예제인 ReactionTime을 MonoTouch로 구현해 보겠습니다. 이번 예제는 순발력을 측정하는 간단한 게임이라고 할 수 있습니다. 응용에 따라서 다양한 게임 형태가 나올 수 있겠습니다.
1. "ReactionTime" 이름으로 새 솔루션을 만듭니다. 솔루션의 타입은 "iPhone MonoTouch Project"를 선택하는 것을 잊으면 안됩니다.







IB의 Library윈도우에서 "View Controller"를 드래그앤드롭으로 객체 윈도우에 가져나 놓으면 됩니다.
이름을 "RootViewController"로 지정하는 것이 중요합니다.
4. "RootViewController.xib"의 뷰에는 화면 전환을 위해 이용되는 Info버튼을 위치 시킵니다. 우선 Library창에서 "Round Rect Button"을 드래그앤드롭으로 뷰의 적당한 위치에 가져다 놓습니다. 예제에선 우측 하단 부분입니다.








5. 어플리케이션에 필요한 이미를 솔루션의 리소스로 추가합니다. 아래 이미지들을 다운 받습니다.



파일 이름은 왼쪽부터 각각 "greenLightSmall.png", "gasPedalSmall.png", "redLightSmall.png", "stopLightCable.png", "yellowLightSmall.png", 그리고 배경이 되는 "road.png" 입니다.컴파일 시에 어플리케이션 디렉토리에 함께 복사 되도록 설정을 변경 해야 합니다. 방법은 각 이미지에서 오른쪽 버튼을 클릭 후에 나오는 메뉴의 "Build Action" 항목 중 "Content"를 설정 하는 것으로 간단히 끝납니다.





| 이미지이름 | X | Y | Width | Height | 기타정보 |
| road.png | 0 | 0 | 320 | 460 | |
| stopLightCable.png | 150 | 0 | 9 | 32 | |
| yellowLightSmall.png | 59 | 20 | 190 | 219 | |
| CustomButton | 237 | 317 | 63 | 123 | type=Custom Image=gasPedalSmall.png |
"MainViewController.xib"의 Identity창을 열고 Outlet과 Action을 추가합니다. Outlet "stopLight"은 타이머에 맞게 이미지 변경을 하기 위해 사용할 UIImageView객체입니다. Action "gasPedalPressed"는 사용자의 액션을 받기 위해 버튼의 이벤트를 처리할 함수입니다.


7. 이번엔 간단한 FlipsideViewController의 뷰를 디자인 합니다. 주의할 사항은 화면에 보시는 것처럼 화면 상단에 "Navigation Bar"가 있다고 가정하고 작업을 해야 합니다. 이를 위해서 뷰의 속성 창을 보시면 "Simulated Interface Elements"항목이 있습니다. 이 속성은 화면 디자인을 위해 미리 특정 요소가 있다는 것을 가정하고 작업할 수 있도록 도와 줍니다. 이번 작업에서는 "Top Bar" 위치에 "Navigation Bar"를 선택합니다. 뷰 화면 상단에 파란색의 "Navigation Bar"가 자리 잡고 있는 것을 확인 할 수 있습니다.

| 뷰 객체 | X | Y | Width | Height | 속성정보 |
| UILabel | 20 | 20 | 280 | 21 | Text=iPhone Apps of C# & MonoTouch Layout-Alignment=Center |
| UILabel | 20 | 49 | 280 | 21 | Text=6번째 예제 : Reaction Time Layout-Alignment=Center |
| UITextView | 20 | 78 | 280 | 308 | Text= "AppsAmuck의 iPhone App예제를 MonoTouch로 구현하는 프로젝트. 1. Minutes to Midnight, 2. Bonfire, 3. OpenURL, 4. What is My IP?, 5. Count Me In, 6. Reaction Time http://neojjang.egloos.com 블로그를 방문 해 주세요." |
여기까지 필요한 파일들과 화면 디자인을 끝냈습니다. 필요한 코드를 하나씩 작업해 보겠습니다.
8. RootViewController를 메인 윈도우의 서브뷰로서 등록합니다. 이 작업이 없으면 어플리케이션 화면에 아무것도 표시 되지 않습니다. 솔루션 창에서 Main.cs파일을 편집창으로 불러 옵니다. 어플리케이션이 실행된 후에 호출되는 함수 "FinishedLaunching"을 찾아 뷰를 등록합니다. window.AddSubview(UIView view) 함수가 등록하는 역할을 해 줍니다.
...
// This method is invoked when the application has loaded its UI and its ready to run
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
// If you have defined a view, add it here:
window.AddSubview (rootViewController.View);
window.MakeKeyAndVisible ();
return true;
}
...
9. RootViewController.xib.cs에 Action(toggleView)구현 하겠습니다. 역할은 info버튼을 클릭 했을 때 MainViewController와 FlipsideViewController를 화면 전환하는 것입니다. 다른 예제들과 같은 내용입니다.
...
public partial class RootViewController : UIViewController
{
MainViewController mainViewController;
FlipsideViewController flipsideViewController;
UINavigationBar flipsideNavigationBar;
..
FlipsideViewController는 실행 초기에는 객체로 생성되어 있지 않기 때문에 toggleView에서 null인지 검사하여 객체를 생성 시켜 주는 "loadFlipsideViewController()"함수를 호출합니다. 이 함수의 역할은 FlipsideViewController를 생성하고 NavigationBar와 필요한 버튼 객체를 추가하는 것입니다.
...
public void loadFlipsideViewController()
{
flipsideViewController = new FlipsideViewController();
flipsideViewController.View.Frame = new RectangleF(0.0f, 44.0f, // ←①
flipsideViewController.View.Frame.Width,
flipsideViewController.View.Frame.Height);
flipsideNavigationBar = new UINavigationBar(new RectangleF(0.0f, 0.0f, 320.0f, 44.0f));
flipsideNavigationBar.BarStyle = UIBarStyle.Black;
UIBarButtonItem buttonItem = new UIBarButtonItem(UIBarButtonSystemItem.Done, delegate{ toggleView(null); }); // ←②
UINavigationItem navigationItem = new UINavigationItem("ReactionTime");
navigationItem.RightBarButtonItem = buttonItem;
flipsideNavigationBar.PushNavigationItem(navigationItem, false);
}
...
(①) 필요합니다. 화면 디자인 할때 "Navigation Bar"가 있는 것을 가정하고 작업을 했지만, MonoDevelop에서 적용이 안되는 버그(?)가 있습니다. 그래서 뷰를 생성할 때 위치를 조정해 주지 않으면 안됩니다. "Navigation Bar"에 MainViewController로 전환하기 위해 버튼(UIBarButtonItem)을 추가했습니다. 버튼이 클릭 되었을 때 호출되는 이벤트 정의를 위해서 delegate를 사용하고 있는 것을(
②) 기억해 둡니다. 많이 사용됩니다. Action "partial void toggleView (UIButton sender)"에서는 화면 전환에 필요한 UIView 애니메이션 처리를 합니다.
...
partial void toggleView (UIButton sender)
{
Console.WriteLine("toggleView");
// flipsideViewController생성
if(flipsideViewController == null) loadFlipsideViewController();
UIView mainView = mainViewController.View;
UIView flipsideView = flipsideViewController.View;
// UIView의 애니메이션 시작을 알립니다.
UIView.BeginAnimations(null);
// 애니메이션은 1초간 이루어집니다.
UIView.SetAnimationDuration(1.0);
// 화면 전환 애니메이션의 방향을 설정합니다. 좌우상하를 지정할 수 있습니다.
UIViewAnimationTransition transition = (mainView.Superview != null) ? UIViewAnimationTransition.FlipFromRight : UIViewAnimationTransition.FlipFromLeft;
UIView.SetAnimationTransition(transition, this.View, true);
// 현재 어떤 뷰가 활성 상태인지에 따라서 보여질 뷰를 결정하는 부분입니다.
if(mainView.Superview != null)
{
// MainView가 활성 상태였기 때문에 flipsideView가 나타날 것을 지정합니다.
flipsideViewController.ViewWillAppear(true);
// MainView는 사라지는 것으로 지정합니다.
mainViewController.ViewWillDisappear(true);
// MainView와 infoButton을 현재 서브 뷰에서 제거합니다.
mainView.RemoveFromSuperview();
infoButton.RemoveFromSuperview();
// FlipsideView와 NavigationBar를 메인 뷰의 서브 뷰로서 등록합니다.
this.View.AddSubview(flipsideView);
// NavigationBar를 순서상 flipsideView의 앞으로 지정합니다.
this.View.InsertSubviewAbove(flipsideNavigationBar, flipsideView);
// 필요한 처리가 끝나고 각 뷰의 상태를 지정합니다.
mainViewController.ViewDidDisappear(true);
flipsideViewController.ViewDidAppear(true);
} else
{
// MainView가 나타날 것을 지정합니다.
mainViewController.ViewWillAppear(true);
flipsideViewController.ViewWillDisappear(true);
// flipsideView와 NavigationBar를 제거합니다.
flipsideView.RemoveFromSuperview();
flipsideNavigationBar.RemoveFromSuperview();
// MainView 와 info버튼을 서브 뷰에 등록합니다.
this.View.AddSubview(mainView);
// info버튼이 순서상 위로 오도록 등록합니다.
this.View.InsertSubviewAbove(infoButton, mainView);
// 필요한 처리가 끝나고 뷰의 상태를 지정합니다.
flipsideViewController.ViewDidDisappear(true);
mainViewController.ViewDidAppear(true);
}
// 뷰의 애니메이션을 시작합니다.
UIView.CommitAnimations();
}
...
10. 이제 실제 내용에 해당하는 MainView.cs에 작업을 해 보겠습니다. "UIAlertView"와 "NSTimer"의 사용 방법과 "Selector"등에 대해서 배울 수 있습니다. 코드를 보겠습니다.
"UIAlertView"를 이용하기 위해 버튼이 눌렸을 때의 이벤트를 처리하기 위해 "UIAlertViewDelegate"를 상속받은 "ClickedAlert" 클래스를 생성했습니다. "Dismissed"이벤트에서 MainView의 "Dismissed"를 호출하도록 되어 있습니다.
...
public class ClickedAlert : UIAlertViewDelegate
{
MainView _view;
public ClickedAlert(MainView view)
{
_view = view;
}
public override void Dismissed (UIAlertView alertView, int buttonIndex)
{
Console.WriteLine("ClickedAlert::Dismissed");
//base.Dismissed (alertView, buttonIndex);// MainView의 Dismissed함수를 호출합니다._view.Dismissed(alertView, buttonIndex);
}
}
...
...
public partial class MainView : UIView
{
int greenLightOn = 0;// 측정 시작 시간을 저장하기 위한 멤버 변수입니다.//DateTime은 C#에서 제공하는 클래스입니다.DateTime startDate;
// 각 타이머에 의해서 호출될 함수를 위한 Selector를 정의 했습니다.private static Selector yellowSelector = new Selector("onYellowLightTimer");
private static Selector redSelector = new Selector("onRedLightTimer");
public MainView ()
{
Console.WriteLine("MainView");
Initialize();
}
public MainView(IntPtr handle) : base(handle)
{
Initialize();
}
public MainView(NSCoder coder) : base(coder)
{
Initialize();
}
public void Initialize()
{
}
// 이 함수는 리소스로부터 로딩이 완료 되었을 때 호출 되는 것으로 알고 있습니다.// 화면에 모든 이미지가 표시 된 후에 UIAlertView의 메시지 창이 실행 됩니다.public override void AwakeFromNib ()
{
Console.WriteLine("AwakeFromNib");
base.AwakeFromNib ();
UIAlertView alert = new UIAlertView("Reaction Time: 준비"
, "녹색 등이 켜진 후 가능한 빨리 발바닥 패달을 터치해 주세요."
, new ClickedAlert(this)
, "Play"
, null);
alert.Show();
}// ClickedAlert(UIAlertViewDelegate)에 의해서 호출되는 함수입니다.// 역할은 내부 상태를 초기화 하는 것입니다.public void Dismissed(UIAlertView alertView, int buttonIndex)
{
Console.WriteLine("Dismissed");// 화면 신호등stopLight.Image = UIImage.FromFile("yellowLightSmall.png");
greenLightOn = 0;
// NSTimer를 설정합니다. C#에선 Objective-C와 다르게 아래의 4가지 함수를 용도에 맞게 제공하고 있습니다.// - NSTimer.CreateRepeatingScheduledTimer
// - NSTimer.CreateRepeatingTimer
// - NSTimer.CreateScheduledTimer
// - NSTimer.CreateTimer//예제에서는 NSTimer.CreateScheduledTimer를 사용하여 1회성 타이머를 구동합니다.// 타이머에 의해 호출되는 것은 yellowSelector로서"onYellowLightTimer"함수가 호출됩니다.NSTimer.CreateScheduledTimer(3.0f, this, yellowSelector, null, false);
}
// 발모양의 이미지 버튼을 터치 했을 때 호출되는 함수로 Action으로서 등록 했습니다.partial void gasPedalPressed (UIButton sender)
{
Console.WriteLine("gasPedalPressed");
// 현재 시간에서 시작 시간을 뺀 시간을 밀리초로 환산하는 부분입니다.// C#의 TimeSpan 클래스를 사용했습니다.TimeSpan period = DateTime.Now.Subtract(startDate);
double noSeconds = (double)(period.TotalMilliseconds);
String reactionTime = String.Format(" 반응 시간은 {0:0.} milliseconds. 더 빨리 눌러 보셔~", noSeconds);
if(greenLightOn == 0) reactionTime = "녹색 등이 켜질 때까지 기다리기! 성격이 급하긴...";
// 메시지만 다른 UIAlertView입니다.UIAlertView alert = new UIAlertView("ReactionTime", reactionTime, new ClickedAlert(this), "OK", null);
alert.Show();
}// Selector를 정의하는 방법입니다. [Export("함수명")] 방식으로 지시합니다.[Export("onYellowLightTimer")]
public void onYellowLightTimer()
{
Console.WriteLine("onYellowLightTimer");// 신호등 이미지를 빨간색 이미지로 변경합니다.stopLight.Image = UIImage.FromFile("redLightSmall.png");
// 랜덤 클래스를 이용하여 임의 난수를 발생 시킵니다.// C#에서 제공하는 랜덤 클래스를 참고 하시면 됩니다.Random rand = new Random();
int delay = (rand.Next() % 7) + 1;
Console.WriteLine(" delay = {0}", delay);// 타이머를 정의하여 지정된 시간 후에 redSelector(onRedLightTimer)가 호출 되도록 합니다.NSTimer.CreateScheduledTimer((3.0+delay), this, redSelector, null, false);
}
// Selector를 정의하는 방법입니다. [Export("함수명")] 방식으로 지시합니다.[Export("onRedLightTimer")]
public void onRedLightTimer()
{
Console.WriteLine("onRedLightTimer");//화면의 신호등을 녹색등 이미지로 교체 합니다.stopLight.Image = UIImage.FromFile("greenLightSmall.png");
greenLightOn = 1;// 현재 시간을 저장합니다.startDate = DateTime.Now;
}
}
...





최근 버젼은 MonoDevelop에서 디버깅을 할 수 있게 되었습니다. 점점 개발이 편하게 되어 가는 군요. 좋은 현상입니다.
다음은 Appsamuck의 7번째 예제에 도전 해 보겠습니다.
# by | 2009/11/06 17:55 | iPhone | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]