Xcode4 로시작하는아이폰프로그래밍 ( 로드북, 2012) _Xcode4.2 에대한추가정보 (2012/1/23) 이책은 Xcode4.0 과 Snow Leopard 를기반으로설명하고있습니다만. 최신버전인 Xcode4.2 에서도 거의그대로사용할수있습니다. 하지만약간의차이가있으므로이차이점에대해다음과같이 3 가지항목으로나누어설명한문서를배포하오니참고바랍니다. A) Xcode 4.2에서바뀐곳은대해 B) Xcode4.0의샘플파일을 Xcode 4.2에서로드할때의주의사항 C) 이책에서설명한내용을 Xcode 4.2에서실행할때의주의사항 A) Xcode4.2 에서바뀐곳은대해 우선 Xcode4.2 에서크게바뀐부분에대해설명합니다. 1) 새프로젝트작성용템플릿의명칭이바뀌었습니다. 아이콘과명칭은바뀌었지만기본은같습니다. "View-based Application" 은 "Single View Application" 으로바뀌었습니다. "Utility Application" 은그대로입니다. "Tab Bar Application" 은 "Tabbed Application" 으로바뀌었습니다. "Navigation-based Application" 은 "Master-Detail Application" 으로바뀌었습니다 ( 지금까지의 Navigation-based 와 Split View-based 가하나로통합된것입니다 ). "OpenGL ES Application" 은 "OpenGL Game" 으로바뀌었습니다. "Window-based Application" 은 "Empty Application" 으로바뀌었습니다. "Page - Based Application" 이새롭게추가되었습니다. (Xcode4.0 의 Choose a template for your new project 화면 )
(Xcode4.2 의 Choose a template for your new project 화면 ) 2) 라이브러리패널이조금바뀌었습니다. Stepper, Gesture Recognizer 가추가되었습니다. 외형이조금바뀌었지만, 책의내용은그대로사용할수있으므로문제없습니다. 3) Automatic Reference Counter(ARC) 기능이추가되었습니다. 지금까지다소번잡했던메모리관리를간편하게만들어주는새로운기능입니다. Xcode 가소스파일을보고필요한곳에자동으로 release 를넣어컴파일을하게끔변경
되었기때문에프로그래머는 release 를넣어줄필요가없어훨씬편해졌습니다. release 를직접넣으면이중입력이되기때문에주의해야됩니다. 하지만, 새프로젝트대화상자에서 ARC 의체크를 OFF 로하고프로젝트를시작하면 Xcode4.0 에서처럼 ( 책에서와같은방법으로 ) 실행할수있습니다. 또한 ARC 를 ON 으로하고시작한프로젝트도 "Build Setting" 탭에서 "Apple LLVM compiler 3.0"> "Objective - C Automatic Reference Counting" 을 "No" 로설정하면, 역시책에서와같은방법으로실행할수있습니다. 4) StoryBoard 기능이추가되었습니다. XIB 가진화한것으로, 한번에여러화면을만들수있게되었습니다. 또한, 화면전환기능을마우스의드래그만으로프로그래밍없이만들수있습니다. 이기능을사용할때는 xib 파일대신에 storyboard 파일이사용됩니다. 참고로새프로젝트대화상자에서 "Use Storyboard" 의체크를 OFF 하고프로젝트를시작하면책에서와같은방법으로실행할수있습니다. 5) iphon 과 ipad 화면을동시에설계할수있게되었습니다. 새프로젝트대화상자의 "Device Family" 에서 "Universal" 을선택하고시작하면 iphone 과 ipad 모두의 xib 파일 ( 또는 storyboard 파일 ) 이만들어진상태에서시작합니다. iphone 전용앱 ( 또는 ipad 전용 ) 을개발할때는 iphone( 또는 ipad) 을선택하면 xib 파일 ( 또는 storyboard 파일 ) 이하나만생성됩니다 ( 책에서쓰는방법 ).
B) Xcode4.0 의샘플파일을 Xcode4.2 에서로드할때의주의사항 이책을따라하면서 Xcode4.0 으로만든샘플파일을 Xcode4.2 에서가져오면경고가나타나지만거의그대로사용할수있습니다. 또한설정을바꿔주면경고를없앨수도있습니다. 1) 샘플파일을로드할때다음과같이 "Project! 1" 이라는경고가뜹니다. 이것은 " 컴파일러설정이오래되었기때문에, 업그레이드를해두는편이좋습니다. 라는의미의경고입니다. 2) 이상태에서도별문제없이앱을만들수있지만바로설정을수정할수도있습니다. 위의그림에서 "Project! 1" 을클릭하면아래와같이 "Validate Project Settings Update to recommended settings" 가뜨는데, 이것을클릭합니다.
3) 그러면다음과같이 " 컴파일러설정을권장설정으로업그레이드하시겠습니까 " 라는 메시지가나타나고, "Perform Changes( 변경사항실행 )" 를클릭합니다. 4) 아래와같은대화상자 ( 변경사항을저장하시겠습니까?) 가나타나고 "Enable" 을클릭하면 변경이실행되고샘플파일에서경고가표시되지않습니다 ( "File> Restore snapshot" 으로 실행을취소할수도있습니다 ). CHAPTER 10-1 [Table View] 를 Xcode4.2 에서실행하면경고메시지가한가지더표시됩니다. 이것은 "initwithframe : reuseidentifier : 라는명령은오래되었기때문에다른방법으로만들어주세요 " 라는경고입니다. 이것은다음과같이수정하면경고가없어집니다. - (UITableViewCell *) tableview : (UITableView *) tableview cellforrowatindexpath : (NSIndexPath *) indexpath
의 if (cell == nil) { cell = [[[UITableViewCell alloc] initwithframe : CGRectZero reuseidentifier : CellIdentifier] autorelease]; 을 if (cell == nil) { cell = [UITableViewCell alloc] initwithstyle : UITableViewCellStyleDefault reuseidentifier : CellIdentifier]; 으로변경하면됩니다. C) 이책에서설명한내용을 Xcode 4.2 에서실행할때의주의사항 기본적으로다음두가지에대해주의하면이책에서제시하는설명대로앱을만들수 있습니다. Xcode4.2 에서바뀐명칭의템플릿을적용해야합니다 (A. 설명참조 ) 새프로젝트를만들때몇가지체크상자에 OFF 를해주어야합니다 (B. 설명참조 ). CHAPTER 4-3, 5-1,5-2, 5-3, 5-4, 5-5, 5-6, 5-7, 5-8, 5-9, 6-1, 6-2, 6-3, 6-4, 7-1, 7-2, 7-3, 7-4, 8-1, 8-2, 8-3, 8-4 [View - based Application 을선택합니다. [Single View Application] 을선택합니다. "Next" 버튼을클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란을 OFF 하고 "Next" 버튼을클릭하여저장합니다. ARC 에체크를 ON 으로하고시작한프로젝트에서 ARC 를 OFF 하려면, Build Setting 에서설정을변경합니다. 1) 프로젝트를엽니다. 2) 맨왼쪽탐색기영역에서상단에있는파란색프로젝트파일을선택합니다. 3) 오른쪽에나타나는화면에서 "Build Setting" 탭을선택하고 "Apple LLVM compiler 3.0" "Objective-C Automatic Reference Counting" 의 "YES" 를 "No" 로전환합니다 ( 항목이많이있기때문에 Reference 에서검색하면빨리찾을수있습니다 ).
이렇게하면, 책에서처럼 release 를쓰는방법으로만들수있습니다. CHAPTER 9-1 [Utility Application xib 파일이름이바뀌었습니다. "Next" 버튼을클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란을 OFF 하고 "Next" 버튼을눌러저장합니다. PRACTICE [2] "MainView.xib" 를클릭하여 "MainViewController.xib" 를클릭하여 PRACTICE [6] "FlipsideView.xib" 를클릭하여 "FlipsideViewController.xib" 를클릭하여 PRACTICE [11] [controller release]; 이구문은제거합니다. CHAPTER 9-2 [Tab Bar Application xib 파일이름과 AppDelegate 의파일이름이바뀌었습니다. "Tab Bar Application" 을선택합니다. "Tabbed Application" 을선택합니다. "Next" 를클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 체크상자를 OFF 로하고, "Next" 를클릭하여저장합니다. PRACTICE [2] "FirstView.xib" 를클릭해서 "FirstViewController.xib" 를클릭해서 PRACTICE [5] "SecondView.xib" 를클릭해서 "SecondViewController.xib" 를클릭해서
PRACTICE [10] [11] "tabbartestappdelegate.h" 를임포트합니다. "AppDelegate.h" 를임포트합니다. # import "tabbarappdelegate.h" # import "AppDelegate.h" tabbarappdelegate * appdelegate = (tabbarappdelegate *) [UIApplication sharedapplication] delegate]; AppDelegate * appdelegate = (AppDelegate *) [UIApplication sharedapplication] delegate]; P343 PRACTICE [5] [6] 단계는모두삭제하고다음과같이변경합니다. PRACTICE [5] AppDelegate.m 의탭표시줄에새로만든화면을추가하는프로그램을작성합니다. "AppDelegate.m" 파일을선택합니다. 1) # import "SecondViewController.h" 다음줄에 # import "myviewcontroller.h" 를추가합니다. 2) -(BOOL) application : (UIApplication *) application didfinishlaunchingwithoptions : 에서, UIViewController * viewcontroller2 = [[[SecondViewController alloc] initwithnibname : @ "SecondViewController"bundle : nil] autorelease]; 다음줄에 UIViewController * viewcontroller3 = [[[myviewcontroller alloc] initwithnibname : @ "myviewcontroller"bundle : nil] autorelease]; 를추가합니다. 3) self.tabbarcontroller.viewcontrollers = [NSArray arraywithobjects : viewcontroller1, viewcontroller2, nil]; 을 self.tabbarcontroller.viewcontrollers = [NSArray arraywithobjects : viewcontroller1, viewcontroller2, viewcontroller3, nil]; 로수정합니다. 4) PRACTICE [6] myviewcontroller.m 에탭표시줄버튼에문자를표시하는프로그램을작성합니다. "myviewcontroller.m" 파일을선택합니다.
- (id) initwithnibname : (NSString *) nibnameornil bundle : (NSBundle *) nibbundleornil 중 if (self) { } 부분을 if (self) { self.title = NSLocalizedString (@ "Third"@ "Third"); } 로변경합니다. CHAPTER 10-1 [Table View] cell 을만드는방법이바뀌었습니다. [View-based Application 을선택합니다. [Single View Application] 을선택합니다. "Next" 를클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란에 OFF 하고 "Next" 를클릭하여저장합니다. PRACTICE [6] if (cell == nil) { cell = [[[UITableViewCell alloc] initwithframe : CGRectZero reuseidentifier : CellIdentifier] autorelease]; IF (cell == nil) { cell = [UITableViewCell alloc] initwithstyle : UITableViewCellStyleDefault reuseidentifier : CellIdentifier]; P362 기본파일이름이 MasterViewController 로바뀌었습니다. [Navigation-based Application] 을선택합니다. [Master-Detail Application] 을선택합니다. "Next" 를클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란에 OFF 하고 "Next" 를클릭하여저장합니다. PRACTICE [2].h 파일 (RootViewController.h) 을선택합니다.
.h 파일 ( MasterViewController.h) 을선택합니다. @ interface RootViewController : UITableViewController @ interface MasterViewController : UITableViewController PRACTICE [3].m 파일 (RootViewController.m) 을선택하고.m 파일 ( MasterViewController.h) 을선택하고 CHAPTER 10-2 [Navigation-Based Application cell 을만드는방법이바뀌어, 하위계층화면이처음부터제공되게되었습니다. [Navigation-based Application] 을선택합니다. [Master - Detail Application] 을선택합니다. [Next] 를클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란을 OFF 하고 [Next] 를클릭하여저장합니다. PRACTICE [2] 단계는삭제. Master-Detail Application 은처음부터하위계층화면이제공되기때문에직접만들필요가없습니다. 하위계층화면의이름은 "DetailViewController" 입니다. PRACTICE [3] "myviewcontoller.xib" 를클릭해서 "DetailViewController.xib" 를클릭해서 PRACTICE [4].h 파일 (myviewcontoller.h) 을선택합니다..h 파일 (DetailViewController.h) 을선택합니다. PRACTICE [6].m 파일 (myviewcontoller.m) 을선택합니다..m 파일 (DetailViewController.m) 을선택합니다. PRACTICE [7].h 파일 (RootViewController.h) 을선택합니다.
.h 파일 (MasterViewController.h) 을선택합니다. PRACTICE [8] 단계는삭제 ( 이미임포트되어있습니다 ) PRACTICE [9].m 파일 (RootViewController.m) 을선택합니다..m 파일 ( MasterViewController.m) 을선택합니다. PRACTICE [11] myviewcontroller * detailviewcontroller = [myviewcontroller alloc] initwithnibname : @ "myviewcontroller"bundle : nil]; detailviewcontroller.dispstr = mydata objectatindex : indexpath.row]; self.detailviewcontroller = [[[ DetailViewController alloc] initwithnibname : @ " DetailViewController "bundle : nil] autorelease]; self.detailviewcontroller. dispstr = mydata objectatindex : indexpath.row]; CHAPTER 10-3 [Cell 지정 cell 을만드는방법이바뀌어, 하위계층화면이처음부터제공되게되었습니다. [Navigation-based Application] 을선택합니다. [Master-Detail Application] 을선택합니다. [Next] 를클릭하여저장합니다. "Device Family" 에서 "iphone" 을선택하고 "Use Storyboard" 와 "Use Automatic Reference Counting" 확인란에 OFF 하고 [Next] 를클릭하여저장합니다. PRACTICE [5] 그러고나서 [File 's Owner ] 를오른쪽버튼으로클릭합니다. [View] 오른쪽에있는 [ ] 를드래그해서선을잡아늘려 [My Cell View Controller] 로연결하면직접작성한셀과직접작성한셀의클래스가연결됩니다. 제거합니다. (4.2 에는 view 가나오지않아셀을직접지정하는방식을사용합니다 ) PRACTICE [7] 루트화면 (RootViewController.h) 에서
루트화면 ( MasterViewController.h) 에서 PRACTICE [7] if (cell == nil) { UIViewController * vc; vc = [UIViewController alloc] initwithnibname : @ "mycell"bundle : nil]; cell = (mycellviewcontroller *) vc.view; } IF (cell = = nil) { UINib * nib = UINib nibwithnibname : @ "mycell"bundle : nil]; NSArray * array = nib instantiatewithowner : nil options : nil]; cell = array objectatindex : 0]; }