SlideShare ist ein Scribd-Unternehmen logo
1 von 21
멀티뷰 애플리케이션 CHAPTER 06
목 차 뷰 스위처 애플리케이션 멀티뷰 애플리케이션의 구조 콘텐츠 뷰 해부 뷰 스위처 만들기 뷰 컨트롤러와 nib 파일 만들기 애플리케이션 델리게이트 수정하기 SwitchViewController.h MainWindow.xib 고치기 SwitchViewController.m작성하기 콘텐츠 뷰 구현하기 전환 시 애니메이션 주기
Introduction 아이폰의 기본 애플리케이션 중 주식 애플리케이션은 두 개의 뷰를 가지는데, 하나는 데이터를 보여주고 다른 하나로는 주식종목을 설정한다 전화 애플리케이션은 탭바를 사용하는 멀티뷰 애플리케이션의 한 예이다 메일 애플리케이션은 내비게이션 바를 사용하는 멀티뷰 애플리케이션의 예이다 아이팟 애플리케이션은 내비게이션 바와 탭바를 모두 사용한다
뷰 스위처 애플리케이션 뷰 스위처를 실행한 모습 뷰 바꾸기(Switch View) 버튼 누른 후 가운데 버튼을 눌렀을 때 보여주는 경고창
멀티뷰 애플리케이션의 구조 최상위 컨트롤러 애플리케이션이 실행되고 나서 사용자에게 최초로 보여지는 컨트롤러 UIViewController,UINavigationController나UITabBarController의 인스턴스가 최상위 컨트롤러로 사용 최상위 컨트롤러는 2개 이상의 뷰를 가지며 사용자의 입력에 알맞는 뷰를 보여주는 역할을 한다. 멀티뷰 애플리케이션에서 화면의 대부분은 콘텐츠 뷰로 구성  각각의 콘텐츠 뷰는 아웃렛과 액션을 포함한 자신만의 컨트롤러를 가지고 있다 일반적으로 각각의 콘텐츠 뷰들은 뷰 컨트롤러, nib, UIView의 하위클래스로 구성
뷰 스위처 만들기 새 프로젝트 생성 프로젝트 이름 View Switcher, Window-based Application옵션 선택
뷰 컨트롤러와 nib 파일 만들기 UIViewControllersubclass 를 선택하고XIB for user interface 옵션을 제외 두개의 .xib파일을 생성 BlueView.xib, YellowView.xib
애플리케이션 델리게이트 수정하기 View_SwitcherAppDelegate.h #import <UIKit/UIKit.h> @class SwitchViewController; @interface View_SwitcherAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; SwitchViewController *switchViewController; } @property (nonatomic, retain) IBOutletUIWindow *window; @property (nonatomic, retain) IBOutletSwitchViewController *switchViewController; @end ,[object Object],#import "View_SwitcherAppDelegate.h" #import "SwitchViewController.h" @implementation View_SwitcherAppDelegate @synthesize window; @synthesize switchViewController; - (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after application launch [window addSubview:switchViewController.view]; [window makeKeyAndVisible]; } - (void)dealloc { [window release]; [switchViewController release]; [super dealloc]; } @end
SwitchViewController.h 필요한 아웃렛이나 액션을 추가해서 MainWindow.xib에 SwitchViewController를 추가 #import <UIKit/UIKit.h> @class BlueViewController; @class YellowViewController; @interface SwitchViewController : UIViewController { YellowViewController *yellowViewController; BlueViewController *blueViewController; } @property (retain, nonatomic) YellowViewController *yellowViewController; @property (retain, nonatomic) BlueViewController *blueViewController; -(IBAction)switchViews:(id)sender; @end
MainWindow.xib 고치기 새로 추가할 클래스는 UIViewController의 하위클래스이므로 라이브러리에서 View Controller(그림)를 찾아서 nib의 메인 창에 끌어놓는다. Drag
MainWindow.xib 고치기 nib 메인 윈도우의 뷰 컨트롤러 아이콘을 클릭하고⌘4를 눌러 아이덴티티(identity) 인스펙터를 띄운다. UIViewController라고 되어 있는 Class 콤보박스를 클릭하고 클래스를 SwitchViewController로 바꾼다.
MainWindow.xib 고치기 최상위 컨트롤러의 컨텐츠 뷰는 화면 하단에 배치될 툴바로 구성 라이브러리에서 뷰를 끌어서 윈도우에 놓는다. 라이브러리에서 툴바를 집은 후 뷰의 바닥으로 끌어서 그림과 같이 만든다. 툴바 버튼을 액션 메서드에 연결 Bar Button Item의 속성 인스펙터를 연다. (⌘1) 버튼에서부터 Switch View 컨트롤러 아이콘으로 컨트롤을 누른 채로 끌어 놓고 switchViews: 액션을 고른다.
SwitchViewController.m작성하기 #import "SwitchViewController.h" #import "BlueViewController.h" #import "YellowViewController.h“ @implementation SwitchViewController @synthesize yellowViewController; @synthesize blueViewController; - (void)viewDidLoad { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [self.viewinsertSubview:blueController.view atIndex:0]; [blueController release]; [super viewDidLoad]; } - (IBAction)switchViews:(id)sender { if (self.yellowViewController.view.superview == nil) { if (self.yellowViewController == nil) { YellowViewController *yellowController = [[YellowViewControlleralloc] initWithNibName:@"YellowView" bundle:nil]; self.yellowViewController = yellowController; [yellowController release]; } [blueViewController.viewremoveFromSuperview]; [self.viewinsertSubview:yellowViewController.view atIndex:0]; } else { if (self.blueViewController == nil) { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [blueController release]; } [yellowViewController.viewremoveFromSuperview]; [self.viewinsertSubview:blueViewController.view atIndex:0]; } } ... - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview [super didReceiveMemoryWarning]; // Release anything that's not essential, such as cached data if (self.blueViewController.view.superview == nil) self.blueViewController = nil; else self.yellowViewController = nil; } - (void)dealloc { [yellowViewController release]; [blueViewController release]; [super dealloc]; } @end
SwitchViewController.m작성하기 #import "SwitchViewController.h" #import "BlueViewController.h" #import "YellowViewController.h“ @implementation SwitchViewController @synthesize yellowViewController; @synthesize blueViewController; - (void)viewDidLoad { BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [self.view insertSubview:blueController.view atIndex:0]; [blueController release]; [super viewDidLoad]; } - (IBAction)switchViews:(id)sender { if (self.yellowViewController.view.superview == nil) { if (self.yellowViewController == nil) { YellowViewController *yellowController = [[YellowViewControlleralloc] initWithNibName:@"YellowView" bundle:nil]; self.yellowViewController = yellowController; [yellowController release]; } [blueViewController.viewremoveFromSuperview]; [self.viewinsertSubview:yellowViewController.view atIndex:0]; } else { if (self.blueViewController == nil) { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [blueController release]; } [yellowViewController.viewremoveFromSuperview]; [self.viewinsertSubview:blueViewController.view atIndex:0]; } } ... - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview [super didReceiveMemoryWarning]; // Release anything that's not essential, such as cached data if (self.blueViewController.view.superview == nil) self.blueViewController = nil; else self.yellowViewController = nil; } - (void)dealloc { [yellowViewController release]; [blueViewController release]; [super dealloc]; } @end ,[object Object]
initWithNibName메서드를 이용하여 BlueView.xib 파일에서 BlueViewController인스턴스를 로드
initWithNibName에 넘기는 파일명에는 .xib확장자가 없는 것에 주의
BlueViewController의 인스턴스를 만들고 나서 blueViewController의 프로퍼티로 할당한다
다음으로 파란 뷰를 최상위뷰의 하위 뷰로 추가
추가할 때 인덱스를 0으로 해서 아이폰이 파란 뷰를 다른 뷰의 뒤에 놓이게 한다.,[object Object]
If yellowViewController.view.superview == nil 이 YES를 리턴하는 경우.
yellowViewController가 존재하지만 뷰가 사용자에게 아직 보여지지 않았다면 그 뷰가 아직 뷰의 계층 구조에 속해 있지 않은 뷰여서 상위뷰를 가지지 않을 때

Weitere ähnliche Inhalte

Andere mochten auch

Maxim.uvarov optimisation2010
Maxim.uvarov optimisation2010Maxim.uvarov optimisation2010
Maxim.uvarov optimisation2010Maxim Uvarov
 
Group 3 integration power point slideshow
Group 3 integration power point slideshowGroup 3 integration power point slideshow
Group 3 integration power point slideshowJustin Fletcher
 
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...Maxim Uvarov
 
Презентация к докладу на оптимизации 2010
Презентация к докладу на оптимизации 2010Презентация к докладу на оптимизации 2010
Презентация к докладу на оптимизации 2010Maxim Uvarov
 
Прикладная аналитика эффективности контекстной рекламы.
Прикладная аналитика эффективности контекстной рекламы. Прикладная аналитика эффективности контекстной рекламы.
Прикладная аналитика эффективности контекстной рекламы. Maxim Uvarov
 
Система рекомендации управленческих решений в стартапе
Система рекомендации управленческих решений в стартапеСистема рекомендации управленческих решений в стартапе
Система рекомендации управленческих решений в стартапеMaxim Uvarov
 
Метрики идеальной контекстной рекламы. Максим Уваров
Метрики идеальной контекстной рекламы. Максим УваровМетрики идеальной контекстной рекламы. Максим Уваров
Метрики идеальной контекстной рекламы. Максим УваровMaxim Uvarov
 

Andere mochten auch (8)

Maxim.uvarov optimisation2010
Maxim.uvarov optimisation2010Maxim.uvarov optimisation2010
Maxim.uvarov optimisation2010
 
Group 3 integration power point slideshow
Group 3 integration power point slideshowGroup 3 integration power point slideshow
Group 3 integration power point slideshow
 
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
Текст доклада для конференции оптимизация 2010. Примеры оценки эффективности ...
 
Презентация к докладу на оптимизации 2010
Презентация к докладу на оптимизации 2010Презентация к докладу на оптимизации 2010
Презентация к докладу на оптимизации 2010
 
Thermaflex in Tallin - Paper 2
Thermaflex in Tallin - Paper 2Thermaflex in Tallin - Paper 2
Thermaflex in Tallin - Paper 2
 
Прикладная аналитика эффективности контекстной рекламы.
Прикладная аналитика эффективности контекстной рекламы. Прикладная аналитика эффективности контекстной рекламы.
Прикладная аналитика эффективности контекстной рекламы.
 
Система рекомендации управленческих решений в стартапе
Система рекомендации управленческих решений в стартапеСистема рекомендации управленческих решений в стартапе
Система рекомендации управленческих решений в стартапе
 
Метрики идеальной контекстной рекламы. Максим Уваров
Метрики идеальной контекстной рекламы. Максим УваровМетрики идеальной контекстной рекламы. Максим Уваров
Метрики идеальной контекстной рекламы. Максим Уваров
 

Ähnlich wie 06 멀티뷰 애플리케이션

10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항Jihoon Kong
 
하이브리드 앱 프레임워크의 구성
하이브리드 앱 프레임워크의 구성하이브리드 앱 프레임워크의 구성
하이브리드 앱 프레임워크의 구성Joonyoung Moon
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftSeongGyu Jo
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
Java, android 스터티7
Java, android 스터티7Java, android 스터티7
Java, android 스터티7Heejun Kim
 
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉KTH, 케이티하이텔
 
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례KTH
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4Usys4u
 
[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1igaworks
 
[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1성인 김
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJSEunYoung Kim
 
Vue guide v0.1
Vue guide v0.1Vue guide v0.1
Vue guide v0.1DataUs
 

Ähnlich wie 06 멀티뷰 애플리케이션 (17)

10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
 
하이브리드 앱 프레임워크의 구성
하이브리드 앱 프레임워크의 구성하이브리드 앱 프레임워크의 구성
하이브리드 앱 프레임워크의 구성
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in Swift
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
Java, android 스터티7
Java, android 스터티7Java, android 스터티7
Java, android 스터티7
 
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
 
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
 
Xamarin.Android(자마린.안드로이드) HelloWorld2_크로스플랫폼 자마린교육, 자마린을 잡으세요~
Xamarin.Android(자마린.안드로이드) HelloWorld2_크로스플랫폼 자마린교육, 자마린을 잡으세요~Xamarin.Android(자마린.안드로이드) HelloWorld2_크로스플랫폼 자마린교육, 자마린을 잡으세요~
Xamarin.Android(자마린.안드로이드) HelloWorld2_크로스플랫폼 자마린교육, 자마린을 잡으세요~
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4U
 
[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1
 
[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1[Iga works] live operation in app notice guide-1.1
[Iga works] live operation in app notice guide-1.1
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJS
 
Vue guide v0.1
Vue guide v0.1Vue guide v0.1
Vue guide v0.1
 

Mehr von Wanbok Choi

[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵Wanbok Choi
 
WWDC 2019 Cheatsheet
WWDC 2019 CheatsheetWWDC 2019 Cheatsheet
WWDC 2019 CheatsheetWanbok Choi
 
iOS 개발자의 Flutter 체험기
iOS 개발자의 Flutter 체험기iOS 개발자의 Flutter 체험기
iOS 개발자의 Flutter 체험기Wanbok Choi
 
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기Wanbok Choi
 
RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017Wanbok Choi
 
try! Swift Tokyo 2017 후기
try! Swift Tokyo 2017 후기try! Swift Tokyo 2017 후기
try! Swift Tokyo 2017 후기Wanbok Choi
 
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017Wanbok Choi
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기Wanbok Choi
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조Wanbok Choi
 

Mehr von Wanbok Choi (9)

[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
 
WWDC 2019 Cheatsheet
WWDC 2019 CheatsheetWWDC 2019 Cheatsheet
WWDC 2019 Cheatsheet
 
iOS 개발자의 Flutter 체험기
iOS 개발자의 Flutter 체험기iOS 개발자의 Flutter 체험기
iOS 개발자의 Flutter 체험기
 
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기
[이모콘 2018 S/S] Swift로 코인 트레이딩 봇 만들기
 
RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017RxSwift 활용하기 - Let'Swift 2017
RxSwift 활용하기 - Let'Swift 2017
 
try! Swift Tokyo 2017 후기
try! Swift Tokyo 2017 후기try! Swift Tokyo 2017 후기
try! Swift Tokyo 2017 후기
 
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017
기획, 디자인 변경에 강한 카드뷰 만들기 - iOS Tech Talk 2017
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조
 

06 멀티뷰 애플리케이션

  • 2. 목 차 뷰 스위처 애플리케이션 멀티뷰 애플리케이션의 구조 콘텐츠 뷰 해부 뷰 스위처 만들기 뷰 컨트롤러와 nib 파일 만들기 애플리케이션 델리게이트 수정하기 SwitchViewController.h MainWindow.xib 고치기 SwitchViewController.m작성하기 콘텐츠 뷰 구현하기 전환 시 애니메이션 주기
  • 3. Introduction 아이폰의 기본 애플리케이션 중 주식 애플리케이션은 두 개의 뷰를 가지는데, 하나는 데이터를 보여주고 다른 하나로는 주식종목을 설정한다 전화 애플리케이션은 탭바를 사용하는 멀티뷰 애플리케이션의 한 예이다 메일 애플리케이션은 내비게이션 바를 사용하는 멀티뷰 애플리케이션의 예이다 아이팟 애플리케이션은 내비게이션 바와 탭바를 모두 사용한다
  • 4. 뷰 스위처 애플리케이션 뷰 스위처를 실행한 모습 뷰 바꾸기(Switch View) 버튼 누른 후 가운데 버튼을 눌렀을 때 보여주는 경고창
  • 5. 멀티뷰 애플리케이션의 구조 최상위 컨트롤러 애플리케이션이 실행되고 나서 사용자에게 최초로 보여지는 컨트롤러 UIViewController,UINavigationController나UITabBarController의 인스턴스가 최상위 컨트롤러로 사용 최상위 컨트롤러는 2개 이상의 뷰를 가지며 사용자의 입력에 알맞는 뷰를 보여주는 역할을 한다. 멀티뷰 애플리케이션에서 화면의 대부분은 콘텐츠 뷰로 구성 각각의 콘텐츠 뷰는 아웃렛과 액션을 포함한 자신만의 컨트롤러를 가지고 있다 일반적으로 각각의 콘텐츠 뷰들은 뷰 컨트롤러, nib, UIView의 하위클래스로 구성
  • 6. 뷰 스위처 만들기 새 프로젝트 생성 프로젝트 이름 View Switcher, Window-based Application옵션 선택
  • 7. 뷰 컨트롤러와 nib 파일 만들기 UIViewControllersubclass 를 선택하고XIB for user interface 옵션을 제외 두개의 .xib파일을 생성 BlueView.xib, YellowView.xib
  • 8.
  • 9. SwitchViewController.h 필요한 아웃렛이나 액션을 추가해서 MainWindow.xib에 SwitchViewController를 추가 #import <UIKit/UIKit.h> @class BlueViewController; @class YellowViewController; @interface SwitchViewController : UIViewController { YellowViewController *yellowViewController; BlueViewController *blueViewController; } @property (retain, nonatomic) YellowViewController *yellowViewController; @property (retain, nonatomic) BlueViewController *blueViewController; -(IBAction)switchViews:(id)sender; @end
  • 10. MainWindow.xib 고치기 새로 추가할 클래스는 UIViewController의 하위클래스이므로 라이브러리에서 View Controller(그림)를 찾아서 nib의 메인 창에 끌어놓는다. Drag
  • 11. MainWindow.xib 고치기 nib 메인 윈도우의 뷰 컨트롤러 아이콘을 클릭하고⌘4를 눌러 아이덴티티(identity) 인스펙터를 띄운다. UIViewController라고 되어 있는 Class 콤보박스를 클릭하고 클래스를 SwitchViewController로 바꾼다.
  • 12. MainWindow.xib 고치기 최상위 컨트롤러의 컨텐츠 뷰는 화면 하단에 배치될 툴바로 구성 라이브러리에서 뷰를 끌어서 윈도우에 놓는다. 라이브러리에서 툴바를 집은 후 뷰의 바닥으로 끌어서 그림과 같이 만든다. 툴바 버튼을 액션 메서드에 연결 Bar Button Item의 속성 인스펙터를 연다. (⌘1) 버튼에서부터 Switch View 컨트롤러 아이콘으로 컨트롤을 누른 채로 끌어 놓고 switchViews: 액션을 고른다.
  • 13. SwitchViewController.m작성하기 #import "SwitchViewController.h" #import "BlueViewController.h" #import "YellowViewController.h“ @implementation SwitchViewController @synthesize yellowViewController; @synthesize blueViewController; - (void)viewDidLoad { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [self.viewinsertSubview:blueController.view atIndex:0]; [blueController release]; [super viewDidLoad]; } - (IBAction)switchViews:(id)sender { if (self.yellowViewController.view.superview == nil) { if (self.yellowViewController == nil) { YellowViewController *yellowController = [[YellowViewControlleralloc] initWithNibName:@"YellowView" bundle:nil]; self.yellowViewController = yellowController; [yellowController release]; } [blueViewController.viewremoveFromSuperview]; [self.viewinsertSubview:yellowViewController.view atIndex:0]; } else { if (self.blueViewController == nil) { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [blueController release]; } [yellowViewController.viewremoveFromSuperview]; [self.viewinsertSubview:blueViewController.view atIndex:0]; } } ... - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview [super didReceiveMemoryWarning]; // Release anything that's not essential, such as cached data if (self.blueViewController.view.superview == nil) self.blueViewController = nil; else self.yellowViewController = nil; } - (void)dealloc { [yellowViewController release]; [blueViewController release]; [super dealloc]; } @end
  • 14.
  • 15. initWithNibName메서드를 이용하여 BlueView.xib 파일에서 BlueViewController인스턴스를 로드
  • 16. initWithNibName에 넘기는 파일명에는 .xib확장자가 없는 것에 주의
  • 17. BlueViewController의 인스턴스를 만들고 나서 blueViewController의 프로퍼티로 할당한다
  • 18. 다음으로 파란 뷰를 최상위뷰의 하위 뷰로 추가
  • 19.
  • 20. If yellowViewController.view.superview == nil 이 YES를 리턴하는 경우.
  • 21. yellowViewController가 존재하지만 뷰가 사용자에게 아직 보여지지 않았다면 그 뷰가 아직 뷰의 계층 구조에 속해 있지 않은 뷰여서 상위뷰를 가지지 않을 때
  • 22. yellowViewController가 생성되지 않았거나 메모리에서 비워져서yellowViewController가 존재하지 않을 때
  • 24. yellowViewController의 인스턴스가 없기 때문에 새 인스턴스 하나를 생성해야 한다.
  • 25. viewDidLoad메서드에서 BlueViewController를 생성했을 때와 같은 방법으로 YellowViewController의 인스턴스를 생성
  • 26. 그다음 뷰 계층에서 blueViewController의 뷰를 삭제하고 yellowViewController의 뷰를 추가#import "SwitchViewController.h" #import "BlueViewController.h" #import "YellowViewController.h“ @implementation SwitchViewController @synthesize yellowViewController; @synthesize blueViewController; - (void)viewDidLoad { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [self.viewinsertSubview:blueController.view atIndex:0]; [blueController release]; [super viewDidLoad]; } - (IBAction)switchViews:(id)sender { if (self.yellowViewController.view.superview == nil) { if (self.yellowViewController == nil) { YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil]; self.yellowViewController = yellowController; [yellowController release]; } [blueViewController.view removeFromSuperview]; [self.view insertSubview:yellowViewController.view atIndex:0]; } else { if (self.blueViewController == nil) { BlueViewController *blueController = [[BlueViewControlleralloc] initWithNibName:@"BlueView" bundle:nil]; self.blueViewController = blueController; [blueController release]; } [yellowViewController.viewremoveFromSuperview]; [self.viewinsertSubview:blueViewController.view atIndex:0]; } } ... - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview [super didReceiveMemoryWarning]; // Release anything that's not essential, such as cached data if (self.blueViewController.view.superview == nil) self.blueViewController = nil; else self.yellowViewController = nil; } - (void)dealloc { [yellowViewController release]; [blueViewController release]; [super dealloc]; } @end
  • 27.
  • 28.
  • 29.
  • 30. 콘텐츠 뷰 구현하기 BlueViewController.m #import "BlueViewController.h“ @implementation BlueViewController - (IBAction)blueButtonPressed { UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"Blue View Button Pressed" message:@"You pressed the button on the blue view" delegate:nil cancelButtonTitle:@"Yep, I did." otherButtonTitles:nil]; [alert show]; [alert release]; } YellowViewController.m #import "YellowViewController.h“ @implementation YellowViewController -(IBAction)yellowButtonPressed { UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"Yellow View Button Pressed" message:@"You pressed the button on the yellow view" delegate:nil cancelButtonTitle:@"Yep, I did." otherButtonTitles:nil]; [alert show]; [alert release]; } ...
  • 31. 전환 시 애니메이션 주기 SwitchViewController.m으로 돌아간다. switchViews: 메소드를 책에 있는 새로운 코드로 바꾼다. 아이폰에서는 다음 네 개의 뷰 트랜지션을 선택할 수 있다 UIViewAnimationTransitionFlipFromLeft UIViewAnimationTransitionFlipFromRight UIViewAnimationTransitionCurlUp UIViewAnimationTransitionCurlDown
  • 32. 전환 시 애니메이션 주기 애니메이션을 진행하는 동안 뷰의 모습이 바뀌지 않으면 항상 캐시를 사용 [UIViewsetAnimationTransition:UIViewAnimationTransitionFlipFromRightforView:self.viewcache:YES]; 트랜지션을 설정한 후 트랜지션할 때 사용하는 뷰별로 각각 한 번씩 메서드를 호출 [self.blueViewControllerviewWillAppear:YES]; [self.yellowViewControllerviewWillDisappear:YES]; 뷰 바꾸기가 끝나면 이 뷰들에 대해 두 번의 호출을 더 한다. [self.yellowViewControllerviewDidDisappear:YES]; [self.blueViewControllerviewDidAppear:YES];