Home » iOS -3. iOS View 컨트롤

iOS -3. iOS View 컨트롤

3.1. Story board

  • 기존 xib(Xcode Interface Builder)의 진화된 형태로 한번에 여러 화면을 만들 수 있다.(View Controller를 드래그 앤 드롭으로 추가할 수 있다.)
  • 화면 전환 기능을 마우스의 드래그만으로 만들 수 있다.

3.2. Xib(Xcode Interface Builder)

  • 화면 하나하나를 구현한 것으로 Android에서 XML의 개념이다.
  • storyboard는 이러한 xib를 한 데 모아놓은 것이다.

3.3. UI구현

  • UI 구현에는 3가지 방식이 있다.
    • storyboard사용
    • xib사용
    • 코드 구현
  • storyboard를 열면 오브젝트 라이브러리(Object Library)에 컨트롤(이하 UI오브젝트)들이 나타난다.
    • Label, Text Field, Slider, Alert View 등 다양한 컨트롤들을 드래그 앤 드롭(Drag & Drop)하여 뷰에 위치하도록 할 수 있다.


그림 9 Story board에서의 View 구현

  • storyboard에서 UI 오브젝트를 추가하지 않고, 다음과 같이 ViewController.m에서 코드로 구현할 수 있다.
    [php]
    -(void)viewDidLoad
    {
    // Label 생성및할당
    UILabel *label = [[UILabelalloc] init];
    // Label Frame 설정(뷰의위치)
    [label setFrame:CGRectMake(20, 20, 280, 40)];
    // UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(20, 20, 280, 40)];

    // set Label Text
    [label setText:@"Test Label"];
    [label setTextColor:[UIColorwhiteColor]];
    [label setBackgroundColor:[UIColordarkGrayColor]];

    // 생성한UILabel오브젝트를뷰에배치
    [self.viewaddSubView:label];
    }
    [/php]

3.4. View와 코드 연결하기(Storyboard)

View와 액션 처리 함수 연결(Story board)

  • IBAction 함수와 연결하기
    • Storyboard의 View에서 마우스 오른 클릭 ->Sent Events -> touch up inside에서 드래그하여 View Controller와 연결한다.


그림 10 Story board에서 View 함수와 연결하기 (1)


그림 11 Story board에서 View 함수와 연결하기 (2)

ViewController.m에서 구현된 startAnimate라는 메서드와 연결됨을 알 수 있다.

IBOutlet

  • ViewController.h에선언한오브젝트를인터페이스빌더가알아볼수있도록하는것이다. Storyboard(xib)파일안의오브젝트와연결을하고자하는모든인스턴스변수들은IBOutlet키워드로다음과같은형식으로선언이되어야한다.

  • 연결은Stroyboard의해당 View Controller Scene의 View Controller를누른후오른쪽버튼을클릭하여 outlets에서해당 UI오브젝트와Stroyboard상의 UI오브젝트와연결한다.

  • 또는Stroyboard상의 UI오브젝트를오른쪽클릭하여 Referencing Outlets에서 View Contoller Scene의 View Controller에드래그하여연결한다.

EX)
[php]
@property (nonatomic, retain) IBOutletUILabel *newLabel;

또는

@interface ViewController : UIViewController
{
IBOutletUIButton *button;
}
@end
[/php]

참고
– retain: 메모리에 할당된 특정 객체를 참조하는 것을 의미한다.
각 객체는 retain count라는 데이터를 가지게 되는데, 객체가 호출될 때마다 카운트 값을 증가시키고, release 될때에는 카운트 값을 하나 감소시키면서 그 객체가 사용되고 있는지의 여부를 판단하게 된다. 이것은 메모리를 효율적으로 관리하기 위한 하나의 수단으로 이용된다.
– nonatomic: 접근자와 변경자 메서드가 생성되는 방법을 바꾼다.
이 옵션에 대해 디폴트로 설정되어 있는 atomic의 경우 멀티스레딩이 가능한 코드들을 추가로 생성하게 된다. 하지만 명시적으로 nonatomic을 설정함으로 멀티 스레딩의 가능성을 줄이고, 불필요한 것들로 인한 오버헤드를 상당부분 줄일 수 있다.

IBAction

  • IBOutlet과마찬가지로ViewController.h에서하나의메서드형태로선언되어그역할을하게된다.
  • IBAction이선언되면이메서드가액션메서드라는것을인터페이스빌더에게알려주게되며, 컨트롤러를통해서호출이가능해진다.
  • IBAction메서드는헤더파일에서다음과같은형식으로선언된다.
  • IBAction의연결은 Storyboard상의 UI오브젝츠를오른클릭한후 Sent Events에서IBOutlet과같은방법으로하면된다.
  • View Controller의 Received Actions에서해당매서드와 UI오브젝트를연결할수도있다.

EX)
[php]
– (IBAction)MethodName:(id)sender;
[/php]

  • 메서드의 형식을 갖는 IBAction는 void를 리턴 타입으로 가진다. 즉, 변수 값을 리턴 하지 않는다.
  • 액션 메서드는 하나의 인자 값을 갖게 되는데, 이것은 sender라는 이름의 id 타입으로 정의되며, 포인터 값이 전달된다. 이것은 똑같은 액션 메서드를 호출하는데 있어서 어떤 액션을 통해서 메서드를 호출하였는지 구분하는 구분자의 역할을 하게 된다. 만약 버튼이 하나 밖에 없는 것처럼, 액션의 구분이 필요하지 않다면 뒷부분의 ‘(id)sender’를 제거하고 작성하면 가능하다. 하지만 버튼이 여러 개 있는데 ‘(id)sender’를 제거하면 모든 버튼이 동일한 역할만을 하게 될 것이다.

3.5. View와 코드 연결하기(Source)

  • 클래스 선언부에서IBOutlet 키워드를 이용하거나, 구현부에서 직접 UI오브젝트를 view위에 삽입한 후 소스 코드 상에서 IBAction과 연결할 수 있다.

IBOutlet을 사용한 경우

[php]
@interface ViewController()
{
IBOutletUIButton *button;
}
@end

@implementation ViewController
-(IBAction)buttonPressed:(id)sender
{….}
-(void)viewDidLoad
{
[super viewDidLoad];

[button setTitle:@”button pressed test” forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonpressed:) forControlEventTouchUpInside];
}
…..
@end
[/php]

코드에서 작성한 경우

[php]
@implementation ViewController
-(IBAction)buttonPressed:(id)sender
{….}
-(void)viewDidLoad
{
[super viewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@”button pressed test” forState:UIControlStateNormal];
// IBAction과연결
[button addTarget:self action:@selector(buttonpressed:) forControlEventTouchUpInside];
[button setFrame:CGRectMake(100.0f, 100.0f, 200.0f, 30.0f)];
[self.viewaddSubview:button];
}
…..
@end
[/php]