이 블로그 검색

2012년 4월 23일 월요일

[iOS] addTarget:action:forControlEvents: 사용하기

addTarget:action:forControlEvents: 이 메서드를 사용하면
각각의 컨트롤러에 XIB를 만들지 않고 한 곳에(보통 AppDelegate가 되겠음..) 공통으로 만든 후
여러 페이지에서 쓸 수 있다.
네비게이션 바 처럼 여러 컨트롤러에 공통으로 쓰이는 컴포넌트는 이 메서드를 이용해
공통 UI 에 액션을 적용 시킬 수 있다.


Ex) 

AppDelegate에 다음과 같이 선언..  

UIButton * NaviButton[3];
UIView * m_view;
UITextField *tf;


[NaviButton[0] addTarget:self action:@selector(eventHome) forControlEvents:UIControlEventTouchUpInside];

[NAviButton[1] addTarget:self action:@selector(eventMenu) forControlEvents:UIControlEventTouchUpInside];

[m_view addTarget:tf action:@selector(eventNaviOk) forControlEvents:UIControlEventTouchUpInside];



실제 각 컨트롤러에서 @selector로 보낸 메서드(메세지) 들을 재정의 해주면 된다.


- (void) eventHome
{
    // 재정의
}

- (void) eventMenu
{
    // 재정의
}

- (void)eventNaviOk
{
   // 재정의
    ESignItemDetailCont
roller *hESignItemDetailController = [[ESignItemDetailController alloc]initWithNibName:@"ESignItemDetailController" bundle:nil];
    [self.navigationController pushViewController:hESignItemDetailController animated:YES];
    [hESignItemDetailController release]; 
}


Ex)


statePicker1 = [[CustomArrayPickerView alloc] init]; // 피커를 만듦






//valueStateChange1 메서드
- (void)valueStateChange1:(CustomArrayPickerView*)arrayPicker   
{
    if([self.appDelegate.calledFromWhere isEqualToString:@"1"]){
        searchLbl.text = [arrStateData1 objectAtIndex:arrayPicker.selectedRow];
    }else{
        searchLbl.text = [arrStateData2 objectAtIndex:arrayPicker.selectedRow];
    }
}


[statePicker1 addTarget:self action:@selector(valueStateChange1:) 
forControlEvents:UIControlEventValueChanged];





댓글 없음:

댓글 쓰기