06 멀티뷰 애플리케이션

3,527 views
3,357 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,527
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

06 멀티뷰 애플리케이션

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

×