설치된 Xcode를 실행하면 아래와 같은 화면이 뜹니다.

여기에서 Create a new Xcode Project를 클릭하면 다음과 같은 화면이 뜹니다.

 

 

저의 환경에서는 6종류의 Application을 만들 수 있는 Project Template이 있군요.

그럼 이제 6종류의 Templates에 대하여 살펴 보기로 하지요.

 

A) Navigation-based Application

This temple provides a starting point for an application that uses a navigation controller. It provides a iser interface configured with a navigation controller to display a list items.

네비게이션 컨트롤러를 기반으로 하는 어플, 계층 구조로 더 깊은 단계로 들어갔다가 나올 수 있는 형태의 어플을 만들 수 있다.

Navigation-based Application 템플릿은 아래 그림의 타이틀 모양과 같은 네비게이션 바를 표시할 때 사용한다. 주로 타이틀과 좌우에 간단한 버튼을 표기할 때 사용한다.




템플릿을 선택한 다음 자동으로 생성된 코드를 그냥 빌드 해보면 위의 오른쪽 그림과 같은 형태가 나온다.

Xcode 에서 빌드하기

Xcode 에서 빌드는 아래와 같이 상단의 아이콘을 클릭하거나 단축키 +를 ㄹ누르면 된다.





위의 왼쪽 그림과 같이 setting 형태의 버튼과 타이틀을 넣는 방법은 여러 가지가 있다. 먼저 Xcode SDK의 UI 구성툴인 Interface Builder(IB)를 이용하는 방법을 살펴보자. Xcode 에디터에서 코드를 수정하는 것이 조금은 필요하다. 위 그림에서 처럼 소스 브라우저 창에서 MainWindow.xib 라는 파일을 더블 클릭하면 인터페이스 빌더가 실행된다. *.xib 파일은 IB에서 사용하는 UI의 프로젝트 파일에 해당된다. IB는 크게 4개의 메인폼을 가지고 있다. 아래 그림 첫번째는 IB에서 사용된 각종 콘트롤들을 아이콘 형태로 보여주는 View 윈도우이며(아래그림1), 해당 View의 설정을 위한 UI 디자인창이 있다.(아래그림2) 그리고, Attribute를 설정하는 창과(아래그림3) 각종 라이브러리와 오브젝트들을 모아 놓은 Library 창이 있다. 여기서 Navigation Controller를 선택하고, Navigation item Attribute의 'Title' 항목과 'Back Button'항목을 아래 세번째 그림처럼 설정해준다. 여기서 설정한 내용은 실시간으로 UI 디자인창에 반영된다. 단, Back Button은 코드를 수정하면 볼 수 있다.







이렇게 만들어진 내용을 IB에서 'File | Save'메뉴로 저장하고 나와서 다시 빌드하면 'Wi-Fi Networks'라는 타이틀이 보일것이다. 그리고, 'Settings' 라는 아이템을 추가 하려면 RootViewController.m 파일에서 주석처리 되어 있는 함수를 아래와 같이 수정하면 된다. 각각의 프로퍼티를 변경해서 iPhone에서 사용되는 각종 Navigation 버튼을 구현할 수 있다.


- (void)viewDidLoad { 

[super viewDidLoad]; 

self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

}



다음은 Controller란 무엇인가를 알 수 있는 간단한 그림입니다.

 

 

다음은 Navigation Controller가 사용되는 간단한 어플입니다.

 


 

B) OpenGL ES Application

This template provides a starting point for an application that uses an OpenGL ES-baces view. It provides a view into which you render your OpenGL ES scene, and a timer to allow you to animate the view.

게임 등을 게발하기 위해서 3D엔진인 OpenGL ES를 사용할 수 있다. (자세한 것은 다음에 만들어 보면서..)

 iPhone OS는 게임등과 같이 화면 전환이 빠르게 요구되는 어플리케이션들을 위해서 그래픽 라이브러리로 OpenGL ES(Open Graphic Library Embedded System)라는 라이브러리를 기본적으로 지원한다.

OpenGL ES는 Khronos Group(http://www.khronos.org/opengles/)에서

제공하는 Open GL의 임베디드 버전이다. 2D와 3D 데이터를 표현하기 위한 C언어 베이스의 크로스 플랫폼 인터페이스이다. 이 템플릿을 추가하면 기존에 화면(View)을 그리기 위해 사용했던 CoreGraphics.framework 대신에 아래 그림과 같은 2개의 framework이 추가 된다.




역시 아무런 조작이 없이 Xcode 에서 'Build and Run' 버튼으로 동작시켜 보면 아래 그림과 같은 애니메이션 어플리케이션이 실행된다.(박스가 상하로 움직이는 것을 볼 수 있다.)




아래 그림은 Open GL/ES템플릿을 선택했을 경우 프로젝트 화면이다. Navigation 템플릿과달리 여러 가지 리소스들이 포함된 것을 볼 수 있다.





Open GL에 관해서 몇 개의 참조 사이트를 소개하도록 하겠다.

http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_

ProgrammingGuide/Introduction/Introduction.html

: 이곳은 Apple 에서 공식적으로 제공하는 OpenGL/ES 프로그래밍 가이드를 소개하는 페이지이다. iPhone OS 에서 OpenGL ES를 활용한 프로그램과 프레임 버퍼를 이용하는 방법, Vertex Data, Texture Data 등을 활용하여 만든 예제, 퍼포먼스 가이드라인, Texturetool 을 사용하는 방법들을 설명해 준다.

또한 아래와 같은 사이트를 참조하라고 소개하고 있다. OpenGL ES API Registry(http://www.khronos.org/registry/gles/)

OpenGL ES 2.0 Reference Pages (http://www.khronos.org/opengles/sdk/docs/man/)

OpenGL ES Framework Reference 함수 설명 사이트 (http://developer.apple.com/iphone/library/documentation/OpenGLES/Reference/OpenGLES_

Framework/index.html#//apple_ref/doc/uid/TP40007628

)

iPhone용 OpenGL ES 강좌 사이트(영문; http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/iPhone_OpenGL.html)

Khoronos group 에서 제공하는 OpenGL ES SDK 메뉴얼 사이트(http://www.khronos.org/opengles/sdk/docs/man/)





C) Tab Bar Application

This template provides a starting point for an application that uses a tabbar. It provides a iser interface configured with a tab bar for the first tab bar item.

Tab Bar를 사용하는 어플을 만드는 곳입니다.

Tab Bar는 Application 뷰의 하단에 위치해서 뷰를 전환하는 역할을 하는 버튼들을 모아놓는 곳이다. Navigation Bar와 유사하다. iPhone OS의 기본프로그램에도 많이 쓰여 지고 있다. 아래 그림은 Tab Bar의 여러 가지 유형의 보여주고 있다.

 





아래 그림은 템플릿을 사용한 프로젝트를 만들고 바로 빌드한 모습니다. 2개의 뷰를 Tab Bar를 사용해서 보여주고 있다.




템플릿을 활용하여 위와 같이 2개의 뷰를 전환하는 예제에서는 각각의 뷰가 필요하다. IB에서 탭이 늘어날 때마다 아래와 같이 Tab Bar Controller Attributes 에서 + 를 클릭한 후 탭과 별도의 뷰를 하나씩 늘려가면 된다.





 


D) Utility Application

This template provides a starting point for a utility application that a main view and a flipside view. It sets up an info button to flip the main view to the flipside, and a navigation bar with a Done item to flip back to the main view.

날씨나 증권같이 위젯 형태의 어플을 만들 수 있는 곳. 단순히 보여주기만 할 뿐, 사용자 입력을 받을 필요가 거의 없는 곳에서 사용하면 적합하다고 하는데 다른 템플보다 이쁘군요.

이 템플릿은 info 버튼이 포함된 Main view와 네비게이션 바를 가진 flipside 형태로 전환되는 뷰를 가진 어플리케이션을 만들때 사용되는 템플릿이다. iPhone 어플리케이션에서 설정 화면등을 구성할 때 자주 사용된다. 아무런 수정도 하지 않고 템플릿을 로드하고 'Build and Run' 했을때 아래와 같은 화면을 볼 수 있다.



이 템플릿은 IB로 디자인하기 위해서 FlipsideView.xib, MainView.xib, MainWindow.xib와 같은 2개의 뷰와 1개의 MainWindow를 가진 리소스를 제공한다. 각각의 View에 해당되는 소스와 ViewController 소스가 템플릿으로 제공되어 진다. 그리고, 이들 뷰간의 동작들을 담당하기 위해서 appDelegate가 역시 템플릿으로 제공된다. (아래 그림참조) 이 템플릿은 MainView에 원하는 Application을 동작시키고 설정 항목등을 FlipsideView에 위치시킬때 사용하면 좋을 것이다.





 

E) View-based Application

This template provides a starting point for an application that uses a single view. It provides a biew controller to manage the view, and a nib file that contains the view.

하나의 뷰가 추가된 어플

이 템플릿은 싱글 뷰를 가진 어플리케이션을 만들 경우 사용되는 템플릿이다. 사실 싱글 뷰로 어플리케이션을 만드는 경우는 거의 없을 것이다. 하지만, 뷰를 조작하기 위한 view controller를 제공해 주고 IB를 위한 간단한 nib 파일을 제공해 준다. 이 템플릿의 장점은 뷰가 많은 Application을 제작할 때 일일이 신경 쓰지 않고도 간단히 원하는 view와 view controller를 가진 UI를 빨리

생성해 주어서 작업능률을 올릴 수 있다는 것이다.






F) Window-based Application

This template provids a starting point for any application. It provides just an application delegate and a window.

가장 기본적인 형태도 뷰도 없다. 따라서 스스로 뷰를 추가하여야 한다.

이 템플릿은 하나의 MainWindow와 AppDelegate 만을 제공해 주는 가장 기본적인 템플릿이다. 개인적으로 IB를 사용하여 UI작업을 할 때 가장 자주 사용하는 템플릿이다. 이 템플릿 위에 뷰와 Object 들을 배치시키고 어플리케이션을 만들 수 있다. 버튼을 누르면 팝업창이 뜨는 간단한 어플리케이션을 예제로 만들어 보겠다.


1) 아래 그림과 같이 MainWindow.xib를 클릭해서 IB를 시작한다.




2) 아래 그림과 같이 IB의 Library 창에서 View Object를 Window 창으로 드래그한다. 그 후에 이 뷰를 메인뷰로 사용할 것이기 때문에 Class명을 myView로 수정한다.






3) 이제 Image View Object와 Round Rect Button Object를 가져와서 그림과 같이 배치한다. Object를 뷰에 올리는 방법은 이전 단계에서 했던 것과 마찬가지로 드래그하면 된다. 그리고, image View Attributes 창에서 aimage.png 라는 그림 파일을 불러온다. 이 그림 파일은 처음에 프로젝트를 만든 후에 Finder로 부터 Project tree로 드래그해서 추가해 놓은 것이다.(필자는 Resources 디렉토리에 두었다.)








4) 이제는 myView에 만들어진 Object들의 IBOutlet을 만들고 event 코드를 작성할 차례이다. IBOutlet은 IB를 사용해서 Object를 포함하는 View를 만들었을 경우 각각의 Object를 control 하기 위해서 만들어 준다.

최종 동작은 '누르세요'라는 버튼을 클릭했을 때 info 베너가 동작하도록 하는 것이다.

IB에서 myView 에 해당되는 소스파일을 프로젝트로 넣기 위해서 저장을 하도록 한다. IB의 메뉴에서 'File | Write Class Files' 를 선택한다. 이 때 myView.h myView.m 파일을 프로젝트에 추가할 것인지를 창이 뜬다. 체크 버튼을 체크해 주고 해당 파일을 프로젝트에 'Add' 해 준다.




5) 프로젝트에 IB에서 만든 UI 소스가 포함되고 나서, 먼저 myView.h 파일의 내용을 아래와 같이 고쳐준다.

#import #import

@interface myView : UIView { IBOutlet UIButton *pBtn; //pBtn을 눌렀을때 showInfo가 동작 IBOutlet UIImage *pImg

} -(IBAction)showInfo;

@end

또, 실제 alert 메시지창을 보여주는 함수 내용은 myView.m에서 작성한다.

#import "myView.h"

@implementation myView -(IBAction)showInfo { UIAlertView *baseAlert = [[UIAlertView alloc] initWithTitle:nil


message:@"showInfo 가 실행되었\n 습니다." delegate:self cancelButtonTitle:nil otherButtonTitles:@"확인",nil];show];release];

}

@end




6) '누르세요' 버튼을 터치다운 했을 경우 showInfo() 라는 함수가 실행되도록 만들기 위해서 IB에서 먼저 해주어야 할일이 있다. 아래 그림처럼 버튼 Object에서 마우스 오른쪽 클릭을 한 후에( 원버튼 마우스의 경우; Ctrl+윈쪽클릭) 'Touch Down' 이벤트를 드래그해서 myView로 가져가면 아래 그림과 같이 showInfo 함수를 선택할 수 있도록 활성화 된다.





7) 이제 저장하고 Xcode에서 빌드하면 showInfo()가 아래 그림과 같이 동작하게 된다. 이런식으로 각각의 Object 들과 터치 이벤트등을 연결할 수 있다.







이상으로 6개의 Project Template를 살펴보았습니다.

그럼 자신이 만들고자 하는 어플과 가장 유사한 템플릿을 선택하여 프로젝트를 시작하면 되겠지요!



출처 : http://blog.naver.com/PostView.nhn?blogId=jforyoum&logNo=60117746694
Posted by 오늘마감
[아이폰 앱 개발] 아이폰 어플 개발 Table View 의 기초

Table View Basics
iPhone tables(UITableView) 의 행(Row)수는 제한이 없음.(iPhone OS Memory)
UITableView - 테이블의 Data를 표시하는 뷰 오브젝트.
UITableViewCell - 테이블의 단일 행을 표현.

UITableViewCell 에 복수의 데이터를 추가하기 위해서
1.UITableViewCell 에 subview 를 추가 하거나
2.UITableViewCell 을 상속하는 서브클래스 작성.

Table > Section > Rows...
그룹 테이블(Figure 8-3)에서 각 Section 은 한 그룹을 나타냄.
인덱스 테이블(Figure 8-3)에서 각 Section 은 한 인덱스의 집합.

Implementing a Simple Table
Writing the Controller

  1. // delegate, datasource protocol 선언.  
  2. // datasource 는 테이블 각 행에 대한 데이터 핸들.  
  3. // delegate 는 데이터의 설정(font, user interation...) 핸들.  
  4. @interface SomeUITableView  {  
  5.     // Table Data.  
  6.     NSArray *tableData;  
  7.     ...  
  8. }  
  9.   
  10. #pragma mark -  
  11. #pragma mark Table View Data Source Methods  
  12. // 해당 Section 에 행 수.  
  13. - (NSInteger)tableView:(UITableView *)tableView  
  14.  numberOfRowsInSection:(NSInteger)section {  
  15.     return [self.tableData count];  
  16. }  
  17.   
  18. // 행이 그려질 때 호출되어 현재 표시될 행의 UITableViewCell 를 리턴.  
  19. // NSIndexPath 를 이용해서 해당 Section[indexPath section]과  
  20. // 해당 행[indexPath row]을 알 수 있음.  
  21. // UITableViewCell 는 캐쉬화 되고 시스템 메모리가 부족할 때 자동 메모리 해제됨.  
  22. - (UITableViewCell *)tableView:(UITableView *)tableView  
  23.          cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  24.     // cache 할 때 구분자.  
  25.     static NSString *SomeID = @"SomeID";  
  26.   
  27.     // cache 에 저장된 UITableViewCell 취득.  
  28.     UITableViewCell *cell = [tableView   
  29.                              dequeueReusableCellWithIdentifier:SomeID];  
  30.   
  31.     if (cell == nil) {  
  32.         cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  
  33.                  reuseIdentifier:SomeID] autorelease];  
  34.     }  
  35.     ...  
  36. }  


Adding an Image
UITableViewCell 의 기본 옵션으로 각 행의 왼쪽에 이미지를 붙일 수 있음.
  1. // tableview:cellForRowAtIndexPath:  
  2. ...  
  3. UIImage *image = [UIImage imageNamed:@"someImage.png"];  
  4. cell.image = image;  
  5. ...  


Addtional Configurations
Setting the Indent Level
  1. #pragma mark -  
  2. #pragma mark Table View Delegate Methods  
  3. // 각 행의 indent level(NSInteger) 설정.  
  4. - (NSInteger)tableView:(UITableView *)tableView  
  5. indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath {  
  6.     ...  
  7.     return indentLevel;  
  8. }  


Handling Row Selection
USER 가 선택한 행의 이벤트 전후로 핸들링이 가능.
  1. - (NSIndexPath *)tableView:(UITableView *)tableView  
  2.   willSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  3.     // USER 선택에 대한 이벤트 전처리.  
  4.     ....  
  5. }  
  6.   
  7. - (NSIndexPath *)tableView:(UITableView *)tableView  
  8.    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  9.     // USER 선택에 대한 이벤트 후처리.  
  10.     ....  
  11. }  


Changing Font Size and Row Height
  1. // tableview:cellForRowAtIndexPath:  
  2. ...  
  3. cell.font = [UIFont boldSystemFontOfSize:80];  
  4. ...  
  5. // 열의 높이 설정.  
  6. - (CGFloat)tableView:(UITableView *)tableView  
  7. heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
  8.     ....  
  9.     return height;  
  10. }  
Posted by 오늘마감
[아이폰 앱 개발] 완성된 아이폰 어플 앱스토어에 올리는 절차
안녕하세요 문씨입니다.
저번에 줄줄이 쓸때 올릴만한 완성된 어플이 없어서 그만 빼먹었었네요;;;
어플을 스토어로 올리기위해서는 크게 두군데에서 준비를 해야합니다. 
하나는 담당 사이트인 아이튠스 코넥트에서 올릴 어플의 정보를 설정하는것이고
다음은 올릴 어플을 준비하는 것입니다.
 먼저 어플을 준비해보겠습니다.
키체인에 배포용 키가 설치되어 있어야 합니다 (http://cafe.naver.com/mcbugi/8953)
먼저 개발자 포탈 사이트에서 배포용 프로비션 프로파일을 만듭니다.
물론 미리 App ID는 만들어 둡니다. (http://cafe.naver.com/mcbugi/8964)
포탈 메뉴에서 Provisioning 메뉴로 들어가서 Distribution 탭으로 들어갑니다.
New Profile을 클릭해서 새로 하나 만듭니다.
올리는 어플 하나당 프로파일이 하나씩 필요합니다.
Profile Name에 어플 이름을 적고
AppID 에서 만든 앱 아이디를 선택합니다
그리고 Submit을 클릭해서 완료합니다
잠시 기다렸다가 새로고침해서 만들어진 프로파일을 다운로드 합니다.
다운 받은 프로파일을 실행해서 설치합니다.
여기까지는 애드훅 설치법과 비슷합니다. (http://cafe.naver.com/mcbugi/9042)
이제 xCode에서 배포할 어플 프로젝트를 엽니다.
info.plist 파일에서 Bundle identifier항목에 만든 AppID를 동일하게 씁니다.
새파일 만들기로 Entitlements.plist파일을 만듭니다.
Adhoc에서는 내용에서 채크를 뺏지만 여기서는 그냥 놔둡니다.
이번에는 프로젝트 설정으로 갑니다. (프로젝트 부분 더블 클릭)
Configurations탭에서 Release를 선택한후 하단에 Duplicate를 클릭합니다.
그리고 새로 만들어진 것을 Distribution으로 이름을 바꿔줍니다
Build탭으로 갑니다
Configuration항목을 Distribution으로 바꾼뒤 Code Signing부분을 봅니다
먼저 Code Signing Entitlements를 수정합니다
아까 만든 파일명을 그대로 적어줍니다
 
Code Signing Identity와 바로 아래 두곳을 맞는 AppID에 찾아서 선택합니다
보통 iPhone Distribution: 이름 및 회사명으로 되어 있습니다
빌드 메뉴에서 Device로 선택하고 버전을 맞춘뒤 항목을 Distribution으로 맞춥니다
CMD + B나 빌드 메뉴에 빌드로 빌드해줍니다.
그럼 Products에 어플.app가 있는것을 볼수 있습니다
항목을 오른쪽 클릭해서 나오는 메뉴에서 Reveal in Finder명령으로 해당 파일의 위치를 엽니다
파인더에서 파일이 두개가 보입니다.
dSYM은 빼고  해당 어플만 압축합니다..
여기까지 파일 준비는 되었습니다
이제는 아이튠스 코넥트에서 올릴 어플 정보를 씁니다
아이튠스 코넥트로 들어갑니다 (https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa)
Manage Your Applications 항목으로 갑니다
 Add New Applicatioin메뉴를 클릭해서 새로 어플 추가를 합니다
어플의 암호화 관련 질문입니다 NO로 하고 다음으로 넘어갑니다
Application Name: 올릴 어플의 이름입니다.
Application Description: 설명을 적습니다
Device Requirements: 지원 기기입니다. iPhone and iPod Touch가 모든 기기 지원이라 보면 됩니다.
다음 두개는 카테고리 선택입니다. 
Copyright은 적당히 저작권 정보를 씁니다 예) smoon.kr 2009 등등;;;
Version Number: 버전 번호 입니다 보통 1.0
SKU Number: 자세히는 모르지만 지신이 구별할 어플 실별 코드라고 보면 됩니다. 전 보통 AppID를 사용합니다
Keywords 검색어 입니다 (전엔 없었는데;;;)
Application URL: 어플 소개 홈피 주소입니다.
Support URL: AS를 위한 사이트 주소입니다
다음은 연락처 이멜 주소입니다
Demo Account: 어플의 종류에 따라서 로그인 인증이 필요한 것도 있습니다.  이럴경우 미리 만들어서 적어줘야 합니다. 심사의원이 따로 가입까지는 안합니다;;; 게임의 경우 테스트용도의 아이디를 대줘야 합니다.
다음  하단의 Continue를 클릭해서 넘어갑니다
등급 설정입니다. 거의 게임이나 폭력성 어플에 해당합니다
적당히 판단하에 선택합니다
다음으로 넘어가면 파일 올리기입니다
Application에 아까 만들어둔 압축파일을 올립니다. 올리는데 시간이 좀 걸리고
다 올라가면 검사도 하기 때문에 에러가 날경우 어딘가 인증 작업을 잘못 했거나 아이콘이 규격에 안맞거나 등등 
원인을 메세지를 알려줍니다.
Large 512...는 대형 아이콘 파일입니다.  JPEG형식에 크기 512 픽셀 정사각형의 이미지를 준비해서 올립니다.
앱스토어에 뜨는 아이콘은 이 파일입니다. 실제 앱 아이콘과 전혀 틀리면 리젝의 원인이 되기도 합니다.
Primary Screenshot 기본 스샷입니다 JPEG로 320 x 480크기만 됩니다
나머지는 추가 스샷으로 기본 스샷과 같은 조건이면 최대 4개 까지 올릴수 있습니다
다 올리면 다음으로 넘어갑니다
가격 설정입니다.
원하는 가격을 설정후 앱스토어에 올라갈 날자를 정합니다 보통 일주일에서 10일 정도 걸리 대충 그 이후로 정합니다.
언어 선택입니다. 그냥 넘어갑니다.
(너무 대충;;;)
마지막으로 적은 정보를 확인뒤 Submit Application을 클릭해서 완료 합니다
Posted by 오늘마감
XCODE2010.10.12 13:06
[아이폰 앱 개발] LightTheCandle 아이폰 어플 만들기
 
 
 
 
IBOutlet을 인스턴스 변수의 타입 앞에 붙여주면 인터페이스 빌더에 노출되고 적당한 UI요소로 연결을 할 수 있다. 각 인스턴스 변수를 property화 하는데, 이들은 IBOutlet으로 지정되어서 인터페이스 빌더에서 적당한 UI요소에 연결될 것이다. 즉 NIB파일이 로드될때 자동으로 생성되는 인스턴스들이다.
 
메소드의 리턴 타입의 void대신 IBAction을 넣어주고, 매게변수 (id)sender로 받도록하면 인터페이스 빌더에 노출되어 특정 UI요소가 터치될 때 실행되는 액션 메소드로 사용될 수 있다.
 
> 뷰 화면에 보이게 설정
 
> Switch에 액션 설정
 
> 리소스 추가하기
 
 
 
 
candle의 상태를 남는 상태변수와 이미지의 변수를 만듬.
 

NSBundle클래스 : 프로그램 안에서 사용되는 코드와 리소스 등을 모아놓은 곳(애플리케이션을 위한 폴더라고 생각~)
 
[NSBundle mainBundle]은 현재 애플리케이션의 실행 파일이 있는 번들을 리턴한다.
-pathForResource:ofType:에 파일의 이름과 확장자를 넘기면 현재 실행되고 있는 애플리케이션의 폴더에서 해당 이름의 리소스가 있는지를 찾고 있으면 그 경로를 넘긴다.
 
넘어온 경로를 이용해 UIImage를 초기화한다.
 
-setImage:메소드를 통해 UIImage를 넘기면 지정된 이미지를 뿌릴수 있다.
 
UISwitch에는 on이라는 프라퍼티가 있으며 BOOL값을 가진다.
 
UILabel의 인스턴스인 candleStateLabel의 text프라퍼티에 "현재 촛불의 꺼져 있으니 켜라"
라는 메시지를 넣어준다.
 
 
LightTheCandleAppDelegate가 dealloc될때 alloc했던 인스턴스를 메모스에서 릴리즈 해준다.
 
 
 
Posted by 오늘마감
아이폰에서 SMS 문자 보내는 어플 만드는 방법

Apple은 sms api공개를 하고 있지 않다.
향후에도 없을것이라고한다.
이유는 모르겠고, 아래처럼 C로 단말기에 직접접근하는 방법뿐이다. 
일반휴대폰이나 임베디드제품개발시  CDMA단말기와 아래와 같은 코드로 인터페이싱한다. 
그러나, 아래와 같은 코드로 app만들면 reject될지도 모름(sms api를 공개안한건 못하게 하려한듯하므로).
AT명령어로써 단말제조업체가 제공하는 프로토콜대로 하면, 패킷을 3G망에 태워 TCPIP방식으로 장문의 메세지도 보낼 수 있다. 과금이 패킷단위라면, SKT의 경우 10초당 13원으로 TCPIP요금을 부과하고있으며,KT는 모름.
굳이 만들겠다면 kt에 확인해서 아래 미국에서 보내는 방식의 AT명령어셋과 동일한지 확인을 할 필요가있다. 통신사나 단말제조사의 스펙이 우리나라와 미국이 다를 수 있기때문이다.
So you know C, you like iPhones, and you want to programmatically send an SMS. I spent a few days of my life a few months ago figuring this out.

Here are the includes and a pretty generic funtion to connect to the iPhone modem and let you do some magic.
(I realize some of those headers aren't actually needed, I think. I copied them from my command-line tool that uses these functions.)
Code:
#include #include #include #include #include #include #include #include #include int connect(){ int speed = 115200; unsigned int null = 0; unsigned int handshake = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS| TIOCM_DSR; struct termios term; int fd = open("/dev/tty.debug", O_RDWR | 0x20000 | O_NOCTTY); if(fd == -1) { perror"Error: "); exit(1); } ioctl(fd, 0x2000740D); fcntl(fd, 4, 0); tcgetattr(fd, &term); ioctl(fd, 0x8004540A, &null); cfsetspeed(&term, speed); cfmakeraw(&term); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 5; term.c_iflag = (term.c_iflag & 0xFFFFF0CD) | 5; term.c_oflag = term.c_oflag & 0xFFFFFFFE; term.c_cflag = (term.c_cflag & 0xFFFC6CFF) | 0x3CB00; term.c_lflag = term.c_lflag & 0xFFFFFA77; term.c_cflag = (term.c_cflag & ~CSIZE) | CS8; term.c_cflag &= ~PARENB; term.c_lflag &= ~ECHO; tcsetattr(fd, TCSANOW, &term); ioctl(fd, TIOCSDTR); ioctl(fd, TIOCCDTR); ioctl(fd, TIOCMSET, &handshake); return fd; }
You don't really need to understand all of that. If you want to, Google ioctl and the other functions used.

Code:
void send(char *number, char *message, int modem) { write(modem,"AT+CMGF=1\r\n",11); sleep(1); write(modem,"AT+CMGS=\"",9); write(modem,number,strlen(number)); write(modem,"\"\r\n",3); sleep(1); write(modem,message,strlen(message)); write(modem,"\x1A",1); sleep(1); close(modem); }
There is a function that takes a pointer to two strings and an int (the file-descriptor of the modem). AT+CMGF=1 sets the phone into SMS mode. AT+CMGS is the command to start writing the address and message into memory, which is terminated with "\x1A" (^Z) to finish the sending process off.

There you go. Switching plain C out for Objective C shouldn't be too hard.
__________________
http://www.ipodtouchfans.com/forums/showthread.php?t=144432



출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=42
Posted by 오늘마감
아이폰 어플 , 가속도 센서에 대한 정리

가속 센서를 이용한 시장 리뷰  http://mobizen.pe.kr/836

............................................................................................................................................................................................

아이폰 기기를 포트레이트모드(일반켰을때 모드인듯.)로 정면을 바라보고 있으면 가속도 센서는 -y방향으로 1, 아이폰을 책상 위에 올려두면 -z방향으로 1의 값을 가짐

가속도 센서가 값을 넘겨주는 주기는 우리가 결정가능

최대 1초에 10번~100번가능,

애플리케이션에 가해지는 부하때문에 유틸리티 같은 애플리케이션에서는 20번을 넘지 않도록 함

만약 게임같이 많이 사용하는 경우라도 60번을 넘지않도록 해야함.

>> 가속도 센서의 값을 이용하는 클래스들

1. UIDevice

UIDevice클래스를 이용하면 아이폰 기기에 대해 싱글톤 접근을 할수 있음

(싱클톤 : 해당 어플리케이션 내에서 유일한 하나의 객체임을 보증하기 위한 방법

    - 목적 : 객체를 하나면 만들기 위해

               프로젝트파일에서 모두 공유하기 위해

    - 장점 : 전역변수를 사용하는 것보다 위험성이 적음, 객체가 두번 이상 생성되는

               실수도 자동 방어)

기기 방향의 변경을 알려주는 노티피케이션 제공

( 노티피케이션 : 오브젝트가 멀리 떨어져 있어 서로 알지 못하는 경우 유용하게 사용

   노티피케이션 센터 : 애플리케이션 내에 유일한 오브젝트(싱글톤 객체)

                            오브젝트 내의 어느 곳에서 접근하더라도 동일한 노티피케이션 센터에

                            접근하게 됨.

                            노트피케이션 센터에 자신이 관심을 가지는 메시지가 올라오는지 지켜

                            보는 오브젝트가 있으며 노티피케이션 센터에 메시지를 올리는 오브젝트

                            존재, 특정 메시지가 올라오면 그 메시지에 관심이 있는

                           오브젝트로 메시지가 전달되며 각자 할일 수행)

아래 코딩은 호출을 통해 디바이스의 방향 전환에 대한 노티피케이션을 받겠다고 선언

[[UIDevice currentDevice] beginGeneratingDeviceOrientatonNotifications];

노티피케이션 센터 리턴하는 코딩

[NSNotificationCenter defaultCenter];

노티피케이션 센터에 통지 올리기

AAA라는 이름의 통지 올리기

아래 코딩을 사용하면 노티피케이션 센터에 통지가 올라갈 뿐만 아니라

통지를 받겠다고 등록한 모든 오브젝트에 메시지가 전달

[[NSNotificationCenter defaultCenter[postNotificationName:

@"AAA" object:self userInfo:nil];

object는 노티피케이션에 함께 동봉되는 오브젝트, 오브젝트 안에 self를 넘기는 이유는 노티피케이션을 받는 쪽에서 필요하면 사용할 수 있도록 함.

userInfo는 우리가 임의의 항목을 만들어서 구독받는 오브젝트에 알릴 수 있도록 함.

또한 임의의 데이터를 패키징하는 딕셔너리,

예) 현재 시각값을 가지는 NSDate 오브젝트를 @"nowDate"라는 키와 쌍을 이뤄

딕셔너리에 넣어준 뒤 보내면 노티피케이션을 구독하는 쪽에서 필요에 따라 그 값을 읽어서 사용

할수 있음.

노티피케이션 센터에 자기 자신을 관찰자로 등록하는 내용

AAA라는 이름의 통지가 올라오면 내가 -addBBB:라는 메소드를 실행시키겠다는 의미

[[NSNotificationCenter dafaultCenter] addObserver:self

selector:@selector(addBBB:) name:@"AAA" object:nil];

UIDevice에서 사용하는 노티피케이션 발행

UIDeviceOrientationDidChangNotification - 디바이스의 현재 방향

(기기의 방향이 바뀌었다는 통지가 날라오면 UIDevice클래스로부터 orientation

프라퍼티를 읽어서 방향 변화에 대한 처리를 함)

UIDeviceBatteryLevelDidChangeNotification - 배터리의 레벨이 변함

디바이스 방향이 더 이상 필요 없을 경우엔

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

호출을 통해 가속도 센서의 이용을 끝내야함.

(가속도 센서를 전원을 많이 소모하는 장치임)

2. UIApplication

애플리케이션에 대한 싱글톤 접근 가능

스테이터스 바(status bar)의 방향을 설정 할 수 있는

statusBarOrientation 프라퍼티 제공

3. UIViewController

이 클래스는 interfaceOrientation프라퍼티를 가지고 있으며

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

메소드를 오버라이드해서 뷰 컨트롤러가 관리하는 뷰가 디바이스의 변화에 대응할지를 YEs나

NO값으로 리턴함

4. UIResponder

터치이벤트가 시작되는 클래스

motion이벤트 : 아이폰의 움직임에 대해 이벤트를 발생시키는 모션.

                    아이폰 3.0에서는 쉐이크밖에 제공하고 있지 않음.

5. UIAcceleometer

가속도 센서에 대한 싱글톤 접근 제공

 UIAccelerometer* theAccel = [UIAccelerometer sharedAccelerometer];

theAccel.updateInterval = 1/30;

theAccel.delegate = self;

+sharedAccelerometer 메소드로 가속도 센서에 접근

1초에 30번 가속도 센서의 값을 전달받겠다고 설정

theAccel의 델리게이트를 self로 지정하면 델리게이트 프로토콜 메소드를 구현해야 함.

 -(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration

{

   // 이벤트 데이터 얻어온다.

   UIAccelerationValue x,y,z;

   x = acceleration.x;

   y = acceleration.y;

   z = acceleration.z;

   // 데이터 처리 코드가 이어져야 한다.

}

UIAccelerameter 오브젝트는 싱글톤이므로 유일한 객체,

따라서 델리게이트메소드 역시 하나만 지정

따라서 하나의 애플리케이션에는 하나의 델리게이트 메소드 역시 하나.

UIAcclerationValue의 값은 double이며, 1이 1g(중력값)을 나타냄

- 하이패스 필터(high pass filter)

 아이폰이 항상 받고 있는 중력값을 필터링해서 없애버리고 움직임만을 얻어내는 기법.

아이폰이 중력에 대해 어떤 상태로 있든 상관없이 저지해있기만 하면

x,y,z값은 0으로 설정하고 움직이는 방향에 대한 값만을 제공하는 것.

  UIAccelerationValue acceleration[3];

 UIAcclerationValue history[kHistorySize][3];

 // 하이패스 필터 기능을 켰는지 점검

 if(filteringIsEnable){

     accleraion[0] = x*kFilteringFactor + acceleration[0]*(1.0-                            kFilteringFactor);

     history[nextIndex][0] = x-accleration[0];

    accleraion[1] = x*kFilteringFactor + acceleration[1]*(1.0-                            kFilteringFactor);

     history[nextIndex][1] = x-accleration[1];

    accleraion[2] = x*kFilteringFactor + acceleration[2]*(1.0-                          kFilteringFactor);

     history[nextIndex][2] = x-accleration[2];

  } else {

     history[nextIndex][0] = x;

     history[nextIndex][1]  = y;

     history[nextIndex][2] = z;

  }

 kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

그래프는 histroy배열에 값에 의해 그려지며 history는 최근 3개의 x,y,z값을 가진다.

acceleration배열은 현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.

그리고 그 값을 다시 현재 가속도 센서의 x값에서 뺀 값을 이용해 움직임에 대한 수치만 history에 넣어서 그래프를 그리는데 사용

-로우패스 필터

미세한 움직임을 필터링하고 중력값을 주로 이용하기 위해 가속도 센서의 값을 가공

즉, 가속센서의 그래프에서 많이 튀는것은 하이패스필터로 잡고

작게 튀는것은 로우패스 필터로 잡는다.

  UIAccelerationValue accel[3];

 accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 -                      kFilteringFactor);

accel[1] = acceleration.x * kFilteringFactor + accel[1] * (1.0 -                      kFilteringFactor);

accel[2] = acceleration.x * kFilteringFactor + accel[2] * (1.0 -                      kFilteringFactor);

kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=30
Posted by 오늘마감
아이폰 어플, text파일 생성 및 내용 저장하는 방법

TEXT파일 생성 & 파일에 내용 저장

NSArray* paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString* documentsDirectory = [paths objectAtIndex:0];

NSString* fullFileName = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"log.txt"];

 const char* szFilePath = [fullFileName UTF8String];

 FILE* fp = fopen( szFilePath, "w" );
 if(fp == nil)     NSLog(@"do not exist log file");
 else

{

   NSString *tableAtt = @"haejinLee";

   // NSString을 char로 바꾸는 작업,

   // 굳이 NSString을 만들지 않아도 되는상황에선 char를 먼저 사용합니다.

   const char* ctableAtt = [tableAtt UTF8String];

   fputs(ctableAtt, fp);

}

아이폰으로 실행시켜 보면

파일이 저장경로는 My Computer에서 Raw File System에서

(저는 i-FunBox에서 확인하였습니다)

//var/mobile/Applications/어플번호/Documents에서 확인하실수 있습니다.

어플번호를 몰라서 당황하시는 분들은

당황하실 필요 없습니다..그냥 자신의 아이폰에 저장되어 있는 어플 (개발 목적으로 넣은어플)

중에 하나..입니다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=27
Posted by 오늘마감
아이폰 어플 개발할때 NaviController 빠르게 만드는 방법
1. window.xib에 Navigation Controller

2. View Controller 3개 

3. View Controller 3개에 각각 구별되게 Title 설정

4. 코딩
 === . h =============================================================

#import

@interface naviTestAppDelegate : NSObject {

    UIWindow *window;

IBOutletUINavigationController *navi;

IBOutletUIViewController *root;

IBOutletUIViewController *first;

IBOutletUIViewController *second;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

=== . m =============================================================

#import "naviTestAppDelegate.h"

@implementation naviTestAppDelegate

@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch

root.title = @"rootview";

navi.viewControllers = [NSArrayarrayWithObject:root];

[windowaddSubview:navi.view];

    [windowmakeKeyAndVisible];

returnYES;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *cIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cIdentifier];

if(cell == nil)

{

cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cIdentifier] autorelease];

}

if(indexPath.row == 0)

cell.textLabel.text = @"first";

else

cell.textLabel.text = @"Second";

return cell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return2;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

if(indexPath.row == 0)

{

[navipushViewController:firstanimated:YES];

}else{

[navipushViewController:secondanimated:YES];

}

}

- (void)dealloc {

[rootrelease];

[firstrelease];

[secondrelease];

[navirelease];

    [window release];

    [super dealloc];

}

@end

5. 각각의 IBOut을 인터페이스 빌더에서 App Delegate로 연결



출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=48
Posted by 오늘마감
아이폰 어플 개발에서 TableView 넣는 방법 간단 정리

1. UIView 밑에 TableView 생성


2. TableView 클릭 + 컨트롤키누르고 file's owner로 드래그 datasource,delegate 2개 클릭


3. 필수함수인 2개를 코딩



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *cIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cIdentifier];

if(cell == nil){

cell = [[[UITableViewCellalloc]

initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cIdentifier]

autorelease];

}

cell.textLabel.text = @"table";

return cell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return5;

}




출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=49
Posted by 오늘마감
아이폰 어플 개발할때 pickerView 세팅하는 방법

pickerView의 디스플레이될 데이타항목 세팅시 나타낼것

#pragma mark -

#pragma mark UIPickerViewDataSource

//picker의 선택항목이 두개일때

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

{

NSString *returnStr = @"";

// note: custom picker doesn't care about titles, it uses custom views

if (pickerView == myPickerView)

{

if (component == 0)

{

returnStr = [pickerViewArray objectAtIndex:row];

}

else

{

returnStr = [[NSNumber numberWithInt:row] stringValue];

}

}

return returnStr;

}

//각 분리된 항목별 디스플레이면적

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component

{

CGFloat componentWidth = 0.0;

if (component == 0)

componentWidth = 240.0;// first column size is wider to hold names

else

componentWidth = 40.0;// second column is narrower to show numbers

return componentWidth;

}

//

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component

{

return40.0;

}

//갯수

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

{

return [pickerViewArraycount];

}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

{

return2;

}




출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=11
Posted by 오늘마감

티스토리 툴바