이 블로그 검색

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];





appDelegate 만들기

iOS 는 특이한 방식으로 전역 함수를 만들어 쓸 수 있다.

방법은 "프로젝트이름AppDelegate.m" 파일에 메서드를 만들어 놓고

self.appDelegate 메서드 이름,  파라메터, .... 형식으로 쓰면 된다.

Ex)
CyberMeritzFireLandAppDelegate.m 파일에 아래와 같은 메서들 만든다.



- (void)addViewType:(UIViewController *)view type:(NSInteger)type
{
    
    if (type == 1)
    {
        m_naviView[0].hidden = NO;
        m_naviView[1].hidden = YES;
        m_naviView[2].hidden = YES;
        m_naviView[3].hidden = YES;
        m_naviView[4].hidden = YES;
        m_naviView[5].hidden = YES;
        m_naviView[6].hidden = YES;
        m_naviView[7].hidden = YES;
        m_naviView[8].hidden = YES;     
    }
    else if (type == 2)
    {
        //, 전체메뉴, 확인
        m_naviView[0].hidden = YES;
        m_naviView[1].hidden = NO;
        m_naviView[2].hidden = YES;
        m_naviView[3].hidden = YES;
        m_naviView[4].hidden = YES;
        m_naviView[5].hidden = YES;
        m_naviView[6].hidden = YES;
        m_naviView[7].hidden = YES;
        m_naviView[8].hidden = YES;

        [m_naviBtn2[0] addTarget:self action:@selector(eventHome) forControlEvents:UIControlEventTouchUpInside];
        [m_naviBtn2[1] addTarget:self action:@selector(eventMenu) forControlEvents:UIControlEventTouchUpInside];
        [m_naviBtn2[2] addTarget:view action:@selector(eventNaviOk) forControlEvents:UIControlEventTouchUpInside];
    }
}




** 이 메서드를 아무데서나,


 [self.appDelegate addViewType:self type:1];
 [self.appDelegate addViewType:sendEmailView type:2];
 ..........


이런식으로 쓸 수 있다..







2012년 4월 21일 토요일

UITextField Delegate - 리턴키 누르면 특정 동작하게

이 녀석을 오버라이드 해 주면 된다.
-(void)textFieldShouldReturn:(UITextField*)textField
{

}

보너스로, 텍스트 필드를 누르면 작동하는 Action은 다음의 delegate 함수를 이용한다.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [dateArrPopView1 removeFromSuperview];  // dateArrPopView1 뷰를 제거한다.
    [view_date removeFromSuperview];        // view_date 뷰를 제거한다.

참고로 이 딜리게이트는 키보드가 올라감에 따라 뷰가 같이 올라가는 기능을 구현해 줄때 많이 쓴다.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{

    //키보드 호출 화면을 위로 이동  
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    CGAffineTransform transform = CGAffineTransformMakeTranslation(0.0, -250.0);
    [self.view setTransform:transform];
    
    [UIView commitAnimations];
     ///////////
       

    [dateArrPopView1 removeFromSuperview];
    
     // -> 만약 textField가 여러개 있고 그 중 특정한 텍스트필드에만 기능을 넣으려면
     // 아래와 같이 tag를 주면된다.

    if([textField tag] == 2){   
        [labState1 setText:@""];

    }
}

// 키보드를 내릴때 기능을 넣고 싶으면 아래와 같이...(화면을 원상 복귀하는 기능을 넣었다.)

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    //키보드 Done 화면을 원래 위치로 
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    CGAffineTransform transform = CGAffineTransformMakeTranslation(0.0, 0.0);
    [self.view setTransform:transform];
    
    [UIView commitAnimations];
}




2012년 4월 15일 일요일

IOS 투명뷰 만들기

1. 뷰 자체의 설정을 clear color 로(오른쪽 뷰 설정 화면) 바꾼다.
2. 서뷰 뷰 내 이미지 뷰를 올려 이미지 뷰 자체의 opaque 를 조정한다.

주의) ==> 뷰 자체의 설정을 clear color로 안해주면 서뷰 뷰의 이미지뷰에서 아무리 작업을 해도 되지 않는다.