2010/08/11 15:12

모달 뷰 (Modal View) 란?

모달 뷰(Modal View)란 iOS(iPhoneOS) 에서 제공하는 여러 개의 뷰를 전환하기 위한 아주 기본적인 뷰 관리 기법 중 하나입니다. 특히 모달 뷰 컨트롤러(Modal View Controller)는 현재 어플리케이션 흐름을 잠시 중단하고 사용자에게 무언가를 입력을 받게 하거나 표시한 후에 다시 원래의 흐름으로 되돌아가도록 흐름을 변경할 때 사용됩니다. 그림을 보며 설명하겠습니다. 아래 표시된 All Calendar / Add Event 간의 관계가 전형적인 모달 뷰 관계로 볼 수 있습니다.



 

일정을 하나 추가하기 위해서는 다음과 같은 절차가 필요합니다.

  • Calender 화면에서 추가하기 버튼을 터치하여 Add Event 화면을 띄웁니다.
  • Add Event 화면에서 일정을 입력합니다.
  • Done 버튼을 터치하여 Add Event 를 종료시킵니다.
  • Calender 화면으로 되돌아 옵니다.


위와 같이 사용자가 일정을 관리하다가  현재의 흐름을 잠시 중단하고 원래의 흐름으로 다시 되돌아 오도록 애플리케이션의 흐름을 구현하고자 할때 모달 뷰를 사용하는 것입니다. 참고로 모달 뷰 모델에서는 호출자(Caller)와 피호출자(Callee)간의 부모(Parent)와 자식(Child) 관계가 생깁니다.

모달 뷰 컨트롤러 띄우기
현재 애플리케이션 흐름에서 모달 뷰 컨트롤러를 띄우기 위해서는 부모 뷰의 인터랙션 내 아래와 같이 구현합니다.

- (IBAction) buttonPressed:(id)sender
  {
     
SecondViewController *viewController = [[SecondViewController alloc] init];    // 새롭게 띄울 뷰 컨트롤러 생성
      [self presentModalViewController:viewController animated:YES];  // 새로운 뷰 컨트롤러를 모달로 표시
  }


모달 뷰 컨트롤러 닫기
모달 뷰를 닫고 원래의 흐름으로 되돌아 가기 위해서는 모달 뷰의 인터랙션 내 아래와 같이 구현합니다.

- (IBAction) buttonPressed:(id)sender
  {
     
[self dismissModalViewControllerAnimated:YES];  // 현재 모달로 띄워진 뷰 컨트롤러를 닫음
 
}



모달 뷰 컨트롤러 전환시 효과주기
iOS에서는 기본적으로 모달 뷰를 전환하기 위한 기본적인 전환 애니메이션을 제공합니다.
모달 뷰를 전환하기 위한 애니메이션 효과는 setModalTransitionStyle을 이용하여 아래와 같이 값을 설정하면 전환시 효과가 적용됩니다.

  -(IBAction)buttonPressed:(id)sender
   {

      SecondViewController *viewController = [[SecondViewController alloc] init];

      [viewController setModalTransitionStyle:UIModalTransitionStylePartialCurl];

      [self presentModalViewController:viewController animated:YES];

   }

  // UIModalTransitionStyleCoverVertical : 모달 뷰가 아래서 위로 덮으며 전환됩니다. (기본값)

  //
UIModalTransitionStyleFlipHorizontal : 앞면의 부모 뷰가 회전되어 뒷면의 모달 뷰로 전환됩니다
  // UIModalTransitionStyleCrossDissolve : 부모 뷰가 서서히 사라짐과 동시에 모달 뷰로 전환됩니다.

  // UIModalTransitionStylePartialCurl : 부모 뷰가 종이처럼 휘어지며 모달 뷰로 전환됩니다.


실행화면 - UIModalTransitionPartialCurl




















레퍼런스

Posted by miniblue
2010/08/11 11:53
환경부와 그린스타트에서 주관하는 모바일 어플리케이션 아이디어 공모전에서
우리의 아이디어 <에코에코(ECO-ECHO) 생활속의 작은 실천이 메아리가 되어>가 동상을 수상하였습니다!

공모전 응모 작품이 218편이라 생각보다 경쟁이 치열했나보네요. !!!

T아카데미에서 만난 선우씨와 미향씨와 함께한 팀에서 난 첫 수확! 앱 공모전에서도 좋은 결실을 맺었으면 좋겠네요 :)

Posted by miniblue
2010/06/19 17:07

두 의미를 살피기 전에 Class(클래스)와 Type(타입)의 의미를 짚고 넘어가겠습니다.

     Integer a = new Integer(7);

객체 a를 생성하기 위해 앞에 붙인 Integer를 부를 때 Class 혹은 Type 이라고 부릅니다. 우리는 무의식적으로 둘을 혼용해서 쓰고 있습니다. 차이점이 없는 것 같지만 둘은 차이가 존재하고 개발자는 이를 구분지을 수 있어야 상속을 통한 상황에 맞는 적절한 객체지향 프로그래밍을 구사할 수 있습니다.

클래스는 "객체가 수행할 행동에 대한 연산의 집합"으로 정의할 수 있습니다. 
클래스는 값을 저장할 변수와 행동에 대한 연산이 구현된 메소드들로 구성되어 있습니다.

타입은 "객체가 수행할 행동에 대한 약속의 집합"으로 정의할 수 있습니다.
타입은 수행할 행동만 약속함으로써 메소드의 선언들로만 구성되어 있습니다.
Java, C# 같은 언어에서는 interface를 통해 타입을 정의할 수 있습니다.

이제 상속 이야기로 가볼까요? 객체지향에서는 2가지 상속 메카니즘이 존재합니다.
상속이란 부모와 자식이 존재할 때 자식이 자신의 행동과 부모의 행동을 받아들일 수 있는 관계를 뜻합니다.
상속은 클래스와 타입을 구분하듯이 클래스를 상속하는 Subclassing과 타입을 상속하는 Subtyping으로 구분됩니다.

Subclassing
Super Class(슈퍼 클래스)에 구현된 코드와 내부 표현 구조를 Sub Class(하위 클래스)가 이어받습니다.
클래스 상속으로 불리기도 하며 하위 클래스에서 슈퍼 클래스에 구현된 코드의 재사용이 가능합니다.

C#을 통해 서브클래싱(클래스 상속)의 예를 들어 보겠습니다.

class A  {
    public String Name()  {
        return "Class name is A";
    }
}
class B : A {
    public String Name() {
        return "Class name is B";
    }
}
public static void PrintName(A obj) {
    Console.WriteLine(obj.Name());
}
static void Main(string[] args) {
    A objA = new A();
    A objB = new B();
    PrintName(objA);   => Class name is A   - (1)
    PrintName(objB);   => Class name is A   - (2)
}

(2)의 결과는 예상과 조금 다르게 나옵니다.  클래스 상속은 부모 클래스의 코드를 재사용하기 때문에 위와 같이 슈퍼클래스의 객체를 하위클래스의 객체로 대체하더라도 하위 클래스의 행동으로 대체되어 동작하지 않습니다. 이는 메소드 재정의(method overriding)를 통해 부모 클래스의 메소드를 대체하여야 합니다. C#에서는 부모에는 virtual 키워드를 넣어 가상함수로 정의하고 자식에는 override 키워드를 넣어 메소드 구현을 재정의를 합니다.

class A  {
    public virtual String Name()  {
        return "Class name is A";
    }
}
class B : A {
    public override String Name() {
        return "Class name is B";
    }
}


Subtyping
Super Type(슈퍼 타입)의 객체가 수행할 행동의 약속을 Sub Type(서브 타입)이 이어받습니다. 행동들을 공통된 타입으로 묶어 Runtime에 슈퍼 타입의 객체를 서브 타입의 객체로 대체가 가능하도록 해줍니다. 이를 통해 프로그램 변경에 대한 영향을 최소화하여 변경에 대한 유연한 대처가 가능토록 제공합니다.
 
C#을 통해 인터페이스를 통한 서브타이핑의 예를 들어 보겠습니다.

interface MyClass  {
    String Name();
}
class A : MyClass {
    public String Name()  {
        return "Class name is A";
    }
}
class B : MyClass {
    public String Name() {
        return "Class name is B";
    }
}
public static void PrintName(MyClass obj) {
    Console.WriteLine(obj.Name());
}
static void Main(string[] args) {
    MyClass objA = new A();
    MyClass objB = new B();
    PrintName(objA);   => Class name is A   - (1)
    PrintName(objB);   => Class name is B   - (2)
}

인터페이스 상속은 부모 타입의 행동의 약속만 상속받습니다. (C#에서 인터페이스에 메소드만 기술할 수 있습니다.) 따라서 슈퍼타입의 객체를 하위타입의 객체로 대체하면 동적으로 하위 타입의 행동으로 대체되어 호출이 됩니다.



Posted by miniblue