티스토리 뷰

Programming language/iOS & objective-C

iOS 정리~

hello-world 2012. 11. 9. 11:22
728x90
반응형

@interface- 클래스 정의


상속- 다른 클래스에서 상속받는 경우, 콜론(:)다음에 상위 클래스 이름이 온다.

프로토콜- 꺽쇠(<>)안에 정의. 프로토콜은 한개 이상인 경우 콤마(,)로 구분하며, JAVA의 인터페이스나 C++의 순수 가상함수와 같은 역활.

                하나의 클래스가 구현할 수 있는 프로토콜수의 제한은 없다.


클래스 멤버를 선언하는 문장은  C++과 같다.

정수나 부동소수점 같은 기본형은 그래로 사용되고, 포인터 앞에는 에스테리스크(*)를 붙인다.

기본적으로 접근 권한은 보호(protected)권한을 갖지만 C++과 유사하게 @private, @public 키워드를 이용해서 권한 설정을 바꿀수 있다.



-(IBAction) sendButton: (id) sender;

 뺄셈기호(-) 인스턴스 메소드

플러스기호(+) 클래스 메소드 또는 정적(static)메소드.

위의 기재한 메소드는 public 접근권한을 가진다.

IBAction은 인터페이스 빌더에게 이 메소드 이벤트에 연결할 수 있는 메소드라고 알려줌.

즉 이 메서드는 nib파일의 컨트롤에서 호출할 수 있는 메서드

IBAction은 반드시 범용 객체 포인터형인 id형의 인자가 하나 선언되어야 한다.

( id는 C++의 void* ,  Java의 Object와 같다 )

액션 메서드는 인자를 전혀 안받거나 보통 sender라고 부르는 단일 인자를 받는다.



@property (nonatomic, retain )IBOutlet UIButton *myButton;

- 아웃렛은 인터페이스 빌더에서 임의의 버튼을 가리키도록 설정할 수 있다.

   IBOutlet은 컴파일러와 관련해서는 아무일도 하지 않는다.

   목적은 nib파일에 있는 객체와 연결할 속성이라는 사실을 인터페이스 빌더에게 알려주는 것 뿐이다.

   nib파일에 있는 객체와 연결해야 하는 속성 앞에서는 항상 IBOutlet키워드를 사용해야 한다.



@property ( strong, nonatomic ) UIPickerView* tweetPicker;

-@property 키워드는 이것이 컴파일러에 의해서 게터(readonly가 아닌경우)와 세터가 만들어질 프로퍼티라고 알려준다.

  @property는 @synthesize와 짝을 이룬다.


xxxxx.h파일-

@property( strong, nonatomic ) IBOutlet UIPickerView *tweetPicker;

@property( strong, nonatomic ) IBOutlet UITextField *myButton;


xxxx.m파일-

@synthesize tweetPicker, myButton;  ///콤마를 찍고 뒤에 추가가 가능.



@property라고 선언하면 프로퍼티가 있다는 것만 알려 줄뿐 어떻게 하라는 것은 얘기 하지 않는다.

구현파일에서 @synthesize키워드로 지정해야만 컴파일러가 게터와 세터를 자동으로 만들어준다.

일단 게터를 생성하고 , 읽기/쓰기(readwrite)속성이 있는 경우에는 세터도 헤더파일에 선언된 프로퍼티 속성에 

따라서 만들어 주게 된다.



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

   리턴형       메소드이름  1번째인자타입 1번째인자로컬이름   2번째인자의 외부이름, 2번째인자형, 2번째인자로컬이름


메소드는 인자에 대해서 내부 및 외부 이름을 갖게 된다. (로컬 이름은 메소드 내부에서 사용)

외부이름은 수신자에게 메세지를 보낼때 사용된다. 그래서 아이폰 OS가 구현할 피커 델리 게이트에게 메세지를 보낼때 다음과

같은 형식으로 보낸다. 

tip- 외부이름은 클래스에게 메세지를 보낼때 기억하기 좋은 이름으로 하고 로컬이름은 사용하기 편한 것으로 할 수 있다.

      또 외부이름은 선택적이기에 지정하지 않으면 메세지를 보낼때 콜론만 사용하면 된다. 하지만 인자의 순서는 중요하다.


[pickerDelegate     pickerView:somePicker     numberOfRowsInComponent:component];

   수신자           메세지이름 1번째인자값       2번째 인자이름    2번째 인자값



프로토콜- 데이터소스 및 델리게이트가 응답할 메세지를 정의. 헤더파일에 선언. 일부는 선택적.


델리게이트-UI컨트롤이 처리해야할 것을 담당. 데이터를 저장하거나 화면에 표시하는 등의 처리를 주로 담당.

                 데이터 소스와 같은 객체일 수도 있으나 자신만의 프로토콜로 정의.


데이터 소스-UI컨트롤에 표시할 데이터를 제공. 실제 데이터는 데이텁이스, 프로퍼티 리스트, 이미지 파일 등 다양한 곳에 저장될 수 있다.

                  델리게이트와 같은 객체일 수 있으나 , 고유한 프로토콜로 정의.\ 



NSString의 stringWithFormat메소드는 편리생성자(convenience constructor)라고 하며 이 메소드 사용하면 printf의 포맷터를 사용할 수 있다.

alloc, new, copy 또는 mutableCopy메소드와는 달리 메소드 내부에서 객체를 alloc, init, autorelease하고 생성하여 넘겨준다.

생성된 객체는 리테인 카운트가 1이고 오토릴리스 풀에 들어가 있는 상태로 받아오기 때문에 현재의 이벤트 루프 안에서 임시적으로 쓸 때 사용됨.



피커 작동-델리케이트와 데이터 소스가 필요.

데이터 소스 프로토콜 -두개의 필수 메소드 

UIPickerViewDatasource 프로토콜- numberOfComponentsInPicker:  컴포넌트는 몇개

                                                   pickerView:numberOfRowInComponent  각컴포넌트에는 몇 줄까지 있는지-각기 다른 배열에서 얻오기에

                                                                                                              따로 처리해야한다.

UIPickerViewDelegate - 두개의 선택적 메소드가 있으나 그중 한개는 필수적으로 호출해야 한다.

                                   pickerView:titleForRow:forComponent: 


UIPickerView--> selectedRowInComponent: 메소드를 호출시에 행동 및 느낌 배열의 인덱스로 바로 쓸 수 있는 피커의 현재 줄번호를 반환


피커 핵심- 

피커는 델리케이트와 데이터 소스가 있어야만 작동.

피커에서 각 바퀴를 컴포넌트라고 부름.

피커에서 바퀴 위의 각 항목은 줄(row)이라고 부름.

프로토콜은 구현할 메세지를 정의.(선택적으로 할 수도 있다)


비공개(private)프레임워크 헤더파일은 사용하지 말기. -

가끔 애플 문서에 정의되어 있지 않은 메소드 중 쓸만한 발견하는 경우가 있다. 그러나 비공개 API를 사용할 경우,

애플이 승인하지 않으므로 앱스토어에서 앱을 판매할 수 없다.





//indexPath는 필요한 셀의 섹션과 줄 번호가 들어 있다.

//cellForRowAtIndexPath 테이블 뷰가 셀을 화면에 보여주려고 할때 호출

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


    //테이블 셀은 식별자(indentifier)를 갖고 있어서 이전에 할당되엇던 셀을 재사용 가능

    static NSString *CellIndentifier=@"Cell"; 


    //혹시 주어진 셀 식별자를 가진 재사용 가능한 셀이 있는지 테이블 뷰에게 확인.

    UITableViewCell *cell=[tableView dequeueReusableCellWithIndentifier:CellIdentifier];

    //재사용할 셀이 없다면 새로운 셀을 만든다.

    if(cell=nil){

       cell=[ [UITableViewCell alloc] initwithStyle:UITableViewCellStyleDefault reuseIndentifier: CellIndentifier ] autoRelease ];

   }


   //테이블을 하나의 컬럼만 가질수 있다.그러나 테이블 셀을 커스터마이즈해서 원하는 다양한 모양을 만들 수있다.

    cell.textLable.text=[self.drinks objectAtIndex:indexPath.row];//여기에서 셀에 들어갈 텍스트 정보를 해당 칵테일 이름으로 넣어줌.

}



//이 메소드는 테이블 뷰에게 얼마나 많은 섹션이 있는지, 각섹션에는 얼마나 많은 줄이 있는지 알려줌.

-(NSInteger)numberOfSectionInTableView: (UITableView *) tableView{

    return 1;

}


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

    return [self.drinks count];

}



순서

1. 배열을 선언하고 프로퍼티선언.

2. 배열구현하고 데이터를 채운다.

3. 테이블에게 몇 줄 필요한지 알려준다.

4. 테이블 셀을 채워 넣는다.


작동방식


테이블뷰 - 테이블 뷰가 새로운 줄을 화면에 보여줘야 할때 데이터소스에게 그 셀을 만들어 달라고 요청.

                화면 밖으로 나간 셀은 재사용 바구니에 들어간다. 이후 아이폰이 메모리를 필요로 하거나 테이블 뷰가 필요로하는 경우 재사용.

데이터소스- 데이터소스는 재사용 가능할 셀이 있는지 테이블 뷰에서 찾아본다. 있다면 꺼내서 내용만 바꾸어 반환.

                  재사용할 수 있는 셀이 없다면 데이터소스는 셀을 생성 내용을 채운다.


1. 배열선언

  @interface RootViewController: UITableViewController{

     NSMutableArray* drinks;

}

@property ( nonatomic, retain ) NSMutableArray* drinks;

-------.h


@synthesize drinks;

-(void) dealloc{

    [drinks release];

    [super dealloc];

}


2. 배열을 구현하고 데이터 채운다.

-(void)viewDidLoad{

   [super viewDidLoad];

     //NSMutableArray를 초기화 하는 메소드는 가변 개수의 인자를 받기에 더이상 인자가 없다는 것을 나타내기 위해 nil을 사용 

     //배열의 마지막 값은 nil 바로 앞의 값이 된다. nil 자신은 배열에 추가되지 않는다.

     //@ 기호는 NSString 객체로 만들라는 단축 명령.

    NSMutableArray* tmpArray=[ [NSMutableArray alloc] initwithObjects:@"aaaa", @"aaaa",@"aaaa",@"aaaa",@"aaaa", nil];

    self.drinks=tmpArray;

    [tmpArray release];

}

3. 테이블에게 몇 줄이 필요한지 알려준다.

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

    return [self.drinks count];//테이블 뷰에게 표현할 줄의 수가 drinks 배열의 항목 개수와 같다고 알려준다.

}


4. 테이블 셀을 채워 넣는다.

 cell.textLable.text=[self.drinks objectAtIndex:indexPath.row];


*배열로 구성된 것은 프로퍼티 리스트(property list)로 바꾸어 쓸 수 있다. 확장자는 .plist이다.

-(void) viewDidLoad{

    [super viewDidLoad];

     

     NSMutableArray *tmpArray=[ [NSMutableArray alloc] initWithObjects:@"aaaa", @"aaaa",@"aaaa",@"aaaa",@"aaaa", nil];

    self.drinks=tmpArray;

    [tmpArray release];

}


==>

/어떤 프로퍼티 리스트파일을 사용할 것이지 알리기 위해서 프로젝트 리소스 번들을 사용한다.

//앱번들에게 DrinkArray.plist 파일의 경로를 요청한다.

NSMutableArray *path=[ [NSBundle mainBundle] pathForResource:@"DrinkArray" ofType:@"plist"];

NSMutableArray *tmpArray=[ [NSMutableArray alloc] initwithContentsOfFile:path]; //프로퍼티 리스트의 내용으로 배열 초기화

self.drinks=tmpArray;


데이터를 드릴-다운시 상세뷰 설정

순서

사용자가 칵테일 이름을 누르면 상세 뷰를 보여준다.

---> 뷰컨트롤러-테이블 뷰의 컨트롤러는 어떤 셀이 선택된 사실을 알게 된다. 그러면 내비게이션 컨트롤러에게 상세뷰를 보여달라고 요청한다.

        상세뷰- 칵테일에 대한 정보( 재료 및 만드는법 )를 보여준다.

       뷰컨트롤러 - 다른뷰와 마찬가지로 상세뷰 역시 자신의 뷰 컨트롤러를 가진다. 이 컨트롤러가 상세뷰의 화면을 채울 책임이 있다.

       데이터소스- 상세뷰는 선택된 칵테일 정보만 보여주므로 데이터 소스는 그 칵테일 정보를 집중해서 보게 된다.













728x90
반응형

'Programming language > iOS & objective-C' 카테고리의 다른 글

블록코딩 ^{}  (0) 2012.11.14
NSDictionary~ +(id)dictionaryWithObjectsAndKeys:~~~~~  (0) 2012.11.09
UIProgress example  (0) 2012.11.08
iOS6 변화 된것 참조  (0) 2012.10.19
@property에 대해  (0) 2012.09.14
댓글