티스토리 뷰
@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;
데이터를 드릴-다운시 상세뷰 설정
순서
사용자가 칵테일 이름을 누르면 상세 뷰를 보여준다.
---> 뷰컨트롤러-테이블 뷰의 컨트롤러는 어떤 셀이 선택된 사실을 알게 된다. 그러면 내비게이션 컨트롤러에게 상세뷰를 보여달라고 요청한다.
상세뷰- 칵테일에 대한 정보( 재료 및 만드는법 )를 보여준다.
뷰컨트롤러 - 다른뷰와 마찬가지로 상세뷰 역시 자신의 뷰 컨트롤러를 가진다. 이 컨트롤러가 상세뷰의 화면을 채울 책임이 있다.
데이터소스- 상세뷰는 선택된 칵테일 정보만 보여주므로 데이터 소스는 그 칵테일 정보를 집중해서 보게 된다.
'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 |
- Total
- Today
- Yesterday
- 리프래시토큰
- Angular
- 자바스크립트
- react
- interceptors
- 반복문
- RefreshToken
- CSS
- git
- Vue3
- svg icon font
- Aptana
- 아이콘 폰트 만들기
- JsDoc
- svg 폰트
- icon font
- cordova
- IntrinsicElements
- vue-router
- git checkout -b
- 앵귤러
- svg모션
- Intrinsic
- 내장요소
- 태그
- react-router-dom
- for of 구문
- anime.js
- 코도바
- React.StrictMode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |