adsense4


[iPhone][MonoTouch] 12번째 예제 : UDecide iPhone

인생은 결정의 연속이며 때론 하기 싫은 결정을 해야 할 때도 있습니다. 뭔가 결정을 해야 할 때 아이폰의 힘을 빌리면 어떨까요? 오늘 만들어 볼 어플리케이션은 뭔가 결정을 해야 할 때 간단히 버튼을 누르는 것만으로 결과를 얻을 수 있도록 도와 줄 겁니다. 특정한 범위의 임의의 값을 얻기 위해 Random클래스를 사용합니다.

Utility프로젝트를 선택하고 "UDecide"이름으로 새 솔루션을 생성합니다.
솔루션 프로젝트의 팝업 메뉴에서 Add - Add Files를 선택하여 어플리케이션 아이콘으로 사용할 이미지를 프로젝트에 추가합니다.
파일 선택 화면에서 "UDecide.png"를 선택합니다.
프로젝트의 파일 목록입니다.
추가한 아이콘 이미지를 어플리케이션 아이콘으로 설정하겠습니다. 프로젝트 팝업메뉴에서 "Options"를 선택하여 프로젝트 옵션 윈도우를 엽니다.
"iPhone Application"카테고리를 선택하고 "Application Icon"항목에 "UDecide.png"를 설정합니다.
어플리케이션의 화면을 구성하기 위해 인터페이스빌더로 작업을 하겠습니다. "FlipsideView.xib"파일을 인터페이스빌더로 열고 필요한 작업을 합니다. "Title"을 "UDecide"로 변경해 주고 저장합니다.
실행 화면의 메인 화면이 되는 "MainView.xib"를 인터페이스빌더에서 열고 작업을 시작합니다. 화면과 같은 화면을 구성합니다.
"Library"윈도우에서 UILabel과 UIButton을 끌어다 놓기로 배치 시킵니다. 추가한 객체 목록은 화면을 참고합니다.
버튼을 눌렀을 때 결정된 결과를 화면에 표시하기 위해 사용되는 UILabel과 연결할 Outlet을 정의 합니다. MainView를 선택하고 Identity윈도우의 Outlet항목에서 추가합니다. Outlet이름은 "result"로 지정하고 Type은 "UILabel"로 지정합니다.
다음 각 버튼의 클릭 이벤트를 받아서 처리하기 위한 Action을 정의 합니다. MainView의 Identity윈도우에서 Action항목에 추가합니다. 각 Action의 이름은 화면을 참고 해 주세요. Type은 지정하지 않고 기본값인 id상태로 둡니다.
각 Outlet과 Action에 대해 화면에 배치한 객체와 연결을 해 줍니다. MainView를 선택하여 Connections윈도우를 열고 화면과 같이 Outlet인 "result"는 UILabel과 연결합니다. 각 Action들은 해당하는 UIButton의 "Touch Up Inside"이벤트와 연결합니다.
Outlet과 Action이 각각 지정된 다른 화면입니다.
연결을 한 후 저장하고 인터페이스빌더를 종료합니다. Outlet과 Action이 해당하는 객체와 이벤트에 연결되면 자동으로 해당하는 xib파일의 *.xib.designer.cs파일에 멤버 변수와 메소드로서 선언을 해 줍니다.

Outlet과 Action이 인터페이스빌더에 의해 자동으로 멤버 변수와 메소드로서 정의 된 MainView클래스의 선언부입니다.

MainView.xib.designer.cs source :
namespace UDecide {

...
 
// Base type probably should be MonoTouch.UIKit.UIView or subclass
[MonoTouch.Foundation.Register("MainView")]
public partial class MainView {

private MonoTouch.UIKit.UILabel __mt_result;

#pragma warning disable 0169
[MonoTouch.Foundation.Export("abcd")] .... ①
partial void abcd (MonoTouch.UIKit.UIButton sender); .... ②

[MonoTouch.Foundation.Export("agreeDisagree")]
partial void agreeDisagree (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("headsTails")]
partial void headsTails (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("leftCenterRight")]
partial void leftCenterRight (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("lottery")]
partial void lottery (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("oneToHundred")]
partial void oneToHundred (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("positiveNegative")]
partial void positiveNegative (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("russianRoulette")]
partial void russianRoulette (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("trueFalse")]
partial void trueFalse (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Export("yesNo")]
partial void yesNo (MonoTouch.UIKit.UIButton sender);

[MonoTouch.Foundation.Connect("result")] .... ③
private MonoTouch.UIKit.UILabel result {
get { .... ④
this.__mt_result = ((MonoTouch.UIKit.UILabel)(this.GetNativeField("result")));
return this.__mt_result;
}
set {
this.__mt_result = value;
this.SetNativeField("result", value);
}
}
}

...
}
① 인터페이스빌더에서 정의한 Action이름을 컴파일러 지시자로 지정하고 있습니다. ② partial형으로 메소드를 정의합니다. 파라미터로 해당 이벤트를 발생한 객체가 전달됩니다. partial이므로 같은 네임스페이스에서 다른 파일에서 정의할 수 있습니다. ③ 인터페이스빌더에서 정의한 Outlet이름을 컴파일러 지시자로 지정하고 있습니다. ④ get/set을 이용하여 정의했습니다.

각 버튼의 Action에 대한 메소드를 구현합니다. 메소드는 MainView.xib.designer.cs에서 미리 정의되어 있습니다. MainView.cs를 편집 상태로 읽어 들입니다. "partial" 키워드를 입력하면 화면처럼 현재 구현이 가능한 partial메소드들의 목록이 화면에 나타납니다.
각 메소드를 선택하면 기본적인 함수의 원형을 만들어 주기 때문에 편하게 작업할 수 있습니다. 소스를 보며 각 부분을 설명합니다.

MainView.cs source :
using MonoTouch.UIKit;
using System.Drawing;
using MonoTouch.Foundation;
using System;

namespace UDecide
{
public partial class MainView : UIView
{
public MainView (IntPtr handle) : base(handle)
{
}

public override void Draw (RectangleF rect)
{
//Drawing code
}

partial void abcd (UIButton sender) .... (1)
{
Random rand = new Random(); .... (2)

int number = rand.Next() % 4; .... (3)

switch(number) { .... (4)
case 0: this.result.Text = "A";
break;
case 1: this.result.Text = "B";
break;
case 2: this.result.Text = "C";
break;
case 3: this.result.Text = "D";
break;
default:
break;
}
}

partial void agreeDisagree (UIButton sender) .... (5)
{
Random rand = new Random();

int number = rand.Next() % 2;
switch(number) {
case 0: this.result.Text = "Agree";
break;
case 1: this.result.Text = "Disagree";
break;
default:
break;
}
}

partial void headsTails (UIButton sender) .... (6)
{
Random rand = new Random();

int number = rand.Next() % 4;
switch(number) {
case 0: this.result.Text = "Heads";
break;
case 1: this.result.Text = "Tails";
break;
default:
break;
}
}
partial void leftCenterRight (UIButton sender) .... (7)
{
Random rand = new Random();

int number = rand.Next() % 3;
switch(number) {
case 0: this.result.Text = "Left";
break;
case 1: this.result.Text = "Center";
break;
case 2: this.result.Text = "Right";
break;
default:
break;
}
}
partial void lottery (UIButton sender) .... (8)
{
Random rand = new Random();

int number = rand.Next() % 3;
switch(number) {
case 0: this.result.Text = "Buy";
break;
case 1: this.result.Text = "Sell";
break;
case 2: this.result.Text = "Hold";
break;
default:
break;
}
}

partial void oneToHundred (UIButton sender) .... (9)
{
Random rand = new Random();
int number = rand.Next() % 100 + 1;
this.result.Text = String.Format("{0}", number);
}

partial void positiveNegative (UIButton sender) .... (10)
{
Random rand = new Random();

int number = rand.Next() % 2;
switch(number) {
case 0: this.result.Text = "Positive";
break;
case 1: this.result.Text = "Negative";
break;
default:
break;
}
}

partial void russianRoulette (UIButton sender) .... (11)
{
Random rand = new Random();

int number = rand.Next() % 6;
switch(number) {
case 0: this.result.Text = "Bang!!!";
break;
default: this.result.Text = "Click....";
break;
}
}

partial void trueFalse (UIButton sender) .... (12)
{
Random rand = new Random();

int number = rand.Next() % 2;
switch(number) {
case 0: this.result.Text = "True";
break;
case 1: this.result.Text = "False";
break;
default:
break;
}
}

partial void yesNo (UIButton sender) .... (13)
{
Random rand = new Random();

int number = rand.Next() % 2;
switch(number) {
case 0: this.result.Text = "Yes";
break;
case 1: this.result.Text = "No";
break;
default:
break;
}
}
}
}
각 Action은 같은 구조로 되어 있습니다. Random클래스의 객체를 생성한 후 임의의 수를 구합니다. Random의 Next()메소드는 정수의 최대수 사이의 임의의 수를 돌려줍니다. 구한 수에 대해서 각 메소드의 역할에 맞게 필요한 범위의 숫자로 정규화 합니다. 마지막으로 정규화된 숫자에 대해 결과를 만들어 출력합니다.

(1) abcd()는 결과로 "a/b/c/d" 네문자 중의 한 문자를 결과로서 출력하는 메소드입니다.
(2) Random클래스의 객체를 생성합니다.
(3) Random.Next()를 이용하여 임의의 수를 구한 후 0~3 사이의 숫자로 만듭니다.
(4) (3)의 수를 이용하여 결과 문자를 선정합니다.

(5)부터는 전체 구성은 같기 때문에 각 메소드의 역할에 대해서만 설명합니다.
(5) agreeDisagree()는 결과로 "agree"/"disagree"를 출력해 줍니다.
(6) headsTails()는 4가지 수를 구해 0과 1에 대해서만  "head"/"tail"을 출력합니다.
(7) leftCenterRight()는 방향을 지정하듯이 "left"/"center"/"right"를 출력합니다.
(8) lottery()는 뭔가를 살것인지, 팔것인지 아니면 보류할 것인지를 결정하도록 "buy"/"sell"/"hold"를 출력합니다.
(9) oneToHundred()는 1~100사이의 수를 출력합니다.
(10) positiveNegative()는 "positive"/"negative"를 출력합니다.
(11) russianRoulette()는 러시안룰렛으로 0~5사이의 수를 구하여 0의 경우 "Bang"을 출력합니다.
(12) trueFalse()는 "true"/"false"를 출력합니다.
(13) yesNo()는 "yes"/"no"를 출력합니다.

실행 시킨 화면 예입니다.



간단히 의사 결정에 응용할 수 있는 어플리케이션을 만들어 봤습니다. 

샘플 코드 : UDecide.zip





 

통계 위젯 (화이트)

67
50
400459

160x600스크래퍼

네이버Analysis