iOS 디자인 모드 - 의뢰 (delegate)

7266 단어 iOS
의뢰 (delegate) 를 대리 라 고도 부 르 는 것 은 iOS 개발 에서 자주 사용 하 는 디자인 모델 이다.우 리 는 protocol (박문 참조: objective - c 프로 토 콜 (protocol) 을 통 해 이러한 디자인 모델 을 편리 하 게 실현 할 수 있 습 니 다.
대리 란 무엇 입 니까?
애플 의 공식 문 서 는 명확 하 게 설명 했다.
Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
다시 말 하면 대 리 는 간단 하고 기능 이 강 한 디자인 모델 로 이런 모델 은 한 대상 이 다른 대상 과 프로그램 에서 다른 대상 과 상호작용 을 하 는 데 사용 된다.주 대상 (delegating object 를 말 합 니 다) 에서 프 록 시 (delegate) 의 인용 을 유지 하고 적당 한 시기 에 이 프 록 시 에 메 시 지 를 보 냅 니 다.이 메 시 지 는 "대리" 의 주 대상 이 곧 처리 하거나 이미 어떤 사건 을 처리 했다 는 것 을 알 립 니 다.이 에이 전 트 는 자신 이나 다른 대상 의 UI 인터페이스 나 다른 상 태 를 업데이트 하여 주 대상 이 보 낸 이 이벤트 의 메시지 에 응답 할 수 있 습 니 다.혹은 어떤 경우 에 발생 할 다른 사건 을 어떻게 처리 해 야 하 는 지 에 영향 을 줄 수 있 는 값 을 되 돌려 줄 수 있 습 니 다.대리 의 주요 가 치 는 여러 대상 의 행동 을 쉽게 맞 출 수 있다 는 것 이다.여기 있 는 대 리 는 명사 입 니 다. 그 자체 가 대상 입 니 다. 이 대상 은 대리 대상 에 의 해 프로그램의 다른 대상 과 접촉 하 는 것 을 전문 적 으로 대표 합 니 다.
코코아 에이전트
Cocoa Touch 프레임 워 크 에서 프 록 시 라 는 디자인 모델 을 대량으로 사 용 했 습 니 다. 모든 UI 컨트롤 류 에서 id 의 delegate 나 dataSource 라 고 밝 혔 습 니 다. Cocoa 의 헤더 파일 을 보면 다음 과 같은 속성 을 많이 발견 할 수 있 습 니 다.
@property(nonatomic, assign)id delegate;   // weak reference
보통 @ property (nonatomic, assign)id> delegate;  즉, 이 대 리 는 특정한 협 의 를 따라 야 한다. 즉, 이 협 의 를 따 르 는 대상 만 이 대리 자격 을 갖 춘 다 는 것 이다.이 동시에 프 록 시 클래스 는 헤더 파일 에 이 protocol 을 따라 야 한다 고 밝 혀 야 합 니 다.name 프로 토 콜 을 실행 하고 그 중의 @ required 방법 을 실현 합 니 다. @ optional 방법 은 선택 할 수 있 습 니 다.
UIAction Sheet 을 예 로 들 면, 이 View 의 어떤 단 추 를 눌 렀 을 때 UIAction Sheet 을 터치 합 니 다. 사용자 가 UIAction Sheet 에 대해 어떤 조작 을 완 료 했 을 때, 예 를 들 어 Destruct 단추 가 눌 렸 거나 cancel 단추 가 눌 렸 을 때, UIAction Sheet 은 delegate 에 이 자 를 보 내 고 delegate 가 사용자 작업 에 대한 응답 을 완성 합 니 다.예 를 들 어 화면 에 문자열 을 인쇄 합 니 다.그림 설명 은 다음 과 같다.
우선, 우 리 는 tab 기반 프로젝트 를 만 들 고 FirstView Controller. h 에 코드 를 추가 하여 UIAction SheetDelegate 프로 토 콜 을 따 르 도록 합 니 다.
@interface FirstViewController : UIViewController 

View 에 이 ActionSheet 을 실행 하려 면 단 추 를 추가 하고 이 단추 의 응답 코드 를 작성 하 십시오.
- (IBAction)invokeActionSheet:(id)sender {
    
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:@"Delegate Example"
                                  delegate:self // telling this class(ViewController) to implement UIActionSheetDelegate
                                  cancelButtonTitle:@"Cancel"
                                  destructiveButtonTitle:@"Destruct"
                                  otherButtonTitles:@"Button 1",@"Button 2",nil];
    
    [actionSheet showInView:self.tabBarController.view];
    [actionSheet release];
}

위 에 중요 한 설정 이 있 습 니 다. 매개 변수 에 delegate: self 가 있 습 니 다. 이 설정 은 UIAction Sheet 의 프 록 시 를 self, 즉 First View Controller 로 가리 키 는 것 입 니 다.
그리고 First View Controller. m 에서 UIAction Sheet Delegate 를 실현 하 는 방법:
#pragma mark --UIActionSheet delegate methods
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    switch (buttonIndex) {
        case 0:
            self.myTextFromActionSheet.text = @"Action Destructed!";
            break;
        case 1:
            self.myTextFromActionSheet.text = @"Action Button 1 Clicked!";
            break;
        case 2:
            self.myTextFromActionSheet.text = @"Action Button 2 Clicked!";
            break;
        case 3:
            self.myTextFromActionSheet.text = @"Cancel Button Clicked!";
            break;
        default:
            break;
    }
    
}

위의 몇 단계 에서 우 리 는 코코아 의 UIAction Sheet 기 존 대리 에 대한 운용 을 완성 했다.그러나 우 리 는 스스로 맞 춤 형 대 리 를 만들어 야 할 때 가 많 습 니 다. 어떻게 실현 해 야 합 니까?
사용자 정의 에이전트
우리 가 해 야 할 일 은 view 를 만 들 고 프 록 시 를 사용자 정의 하여 이 view 의 문자열 을 업데이트 하 는 것 입 니 다.위 에서 우 리 는 이미 tab 프로젝트 를 만들어 서 안의 second view 를 빌 렸 다.ChangeText 라 는 단 추 를 끌 어 옵 니 다. 응답 함 수 는 - (IBAction) changeText: (id) sender 입 니 다.이 단 추 를 누 르 면 modal view 이름 이 ChangeTextView 에 들 어 갑 니 다. 저 희 는 ChangeTextView 에 문자열 을 입력 하고 이 view 를 종료 한 후에 이 문자열 을 second view 에 업데이트 합 니 다.어떻게 modal view 와 second view 간 의 데이터 전달 을 실현 합 니까?바로 대리!누구의 대리 입 니까?ChangeTextView 의 에이전트!ChangeTextView 에 데 이 터 를 직접 입력 하기 때문에 에이전트 가 입력 한 문자열 을 second view 에 피드백 해 야 합 니 다.
1. 새로운 종류의 ChangeTextView Controller 를 만 들 고 해당 하 는 xib 파일 을 만 듭 니 다.
2. ChangeTextView Controller. h 에서 프로 토 콜 ChangeTextView Delegate 를 설명 합 니 다.
@protocol ChangeTextViewDelegate 

- (void) textEntered:(NSString*) text;

@end

UIAction Sheet 과 유사 합 니 다. ChangeTextView Controller 에 도 프 록 시 성명 을 추가 해 야 합 니 다.
@property (assign, nonatomic) id delegate;

3. ChangeTextView Controller. xib 에 단추 save 를 추가 해 야 합 니 다. 이 단 추 를 누 르 면 second view 로 돌아 가 문자열 을 업데이트 합 니 다.save 단추 에 대한 응답 함 수 는:
- (IBAction)saveButtonClicked:(id)sender {
    //Is anyone listening
    if([delegate respondsToSelector:@selector(textEntered:)])
    {
        //send the delegate function with the amount entered by the user
        [delegate textEntered:textEntered.text];
    }
    
    [self dismissModalViewControllerAnimated:YES];
}

[delegate textEntered:textEntered.text];이 코드 의 의 미 는 ChangeTextView Controller 알림 에이전트 입 니 다. textEntered 이 사건 이 발생 했 습 니 다. textEntered 라 는 메시지 의 실현, 즉 이 textentered 에 어떻게 응답 하 는 지 는 에이전트 에서 이 루어 집 니 다.이 예 에서 SecondView Controller 는 Change TextView Controller 대상 의 대리 입 니 다.따라서 저 희 는 SecondView Controller 에 대해 해당 하 는 설정 을 해서 대리 의 조건 을 만족 시 켜 야 합 니 다.우선, SecondViewController. h 에서 협 의 를 따 르 겠 다 고 밝 혔 습 니 다. ChangeTextViewDelegate.그리고 ChangeText 단추 의 응답 함수 - (IBAction) changeText: (id) sender 를 편집 합 니 다.
- (IBAction)changeText:(id)sender {
    ChangeTextViewController *CTViewController = [[ChangeTextViewController alloc] initWithNibName:@"ChangeTextViewController" bundle:nil];
    //Assign this class to the delegate of ChangeTextViewController,
    //remember to make thie ViewController confirm to protocol "ChangeTextViewDelegate"
    //which is delared in file ChangeTextViewController.h
    CTViewController.delegate = self;
    [self presentModalViewController:CTViewController animated:YES];
}

주의, CTViewController. delegate = self;이 문장 은 SecondViewController 가 ChangeTextViewController 대상 이 되 는 대 리 를 실현 했다.
본 논문 에 대응 하 는 소스 코드 다운로드:http://download.csdn.net/detail/lovefqing/4874331
만약 본 논문 에 잘못된 점 이 있다 면 벽돌 을 치 며 지적 하고 함께 발전 하 는 것 을 환영 합 니 다. 감사합니다!

좋은 웹페이지 즐겨찾기