2012-01-21 4 views
1

당신에게 popOver Tableview 컨트롤러를 제공하는 앱이 있습니다. 이 popOver에는 n 개의 셀이 있습니다. Popover의 테이블 셀 중 하나를 건드릴 때마다 메인 뷰에서 함수를 호출 할 수 있어야합니다. 그 일을 어떻게 하죠? 이 콘솔을 셀의 텍스트를 인쇄합니다,하지만 난 할 수 있어야Popover UITableViewController mainView에서 트리거 액션

여기
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSLog(@"Cell check %@", [totalArray objectAtIndex:indexPath.row]); 
    [self dismissPopoverAnimated:YES]; 
} 

그것은 너무 한 번 세포가 접촉하는 팝 오버를 기각 할 것이 좋을 것이다 .... 그 셀 텍스트를 메인 뷰로 다시 넘겨줍니다 ... 오 그래, [self dismisspopoveranimated : 예]가 작동하지 않습니다 ...

답변

3

전통적인 방법은 "메인"뷰 컨트롤러를 델리게이트로 만드는 것입니다 테이블보기가있는 클래스의 :

  1. 애플리케이션 별 위임 프로토콜을 정의하고 유스 케이스에 맞는 위임 메소드를 추가하고이를 준수하도록 "메인"뷰 컨트롤러를 변경하십시오. 대리자 메서드는 "주"보기 컨트롤러 (귀하의 경우에는 UITableViewCell 또는 텍스트가 포함 된 NSString)로 전달할 데이터 형식의 매개 변수를 가져야합니다.
  2. 형식이 새 대리자 프로토콜 인 테이블 뷰를 사용하여 클래스에 속성을 만듭니다.
  3. "기본"보기 컨트롤러를 새 속성의 값으로 설정하여 테이블보기가있는 클래스로 전달하십시오.
  4. tableView:didSelectRowAtIndexPath: 메서드를 호출하면 만든 대리자에서 대리자 메서드를 호출하고 "주"뷰 컨트롤러에 제공 할 데이터를 전달합니다. 이렇게하면 "메인"뷰 컨트롤러에 테이블 셀이 popover에서 선택되었다는 사실에 응답 할 수있는 기회가 주어지며 필요한 모든 기능을 호출 할 수 있습니다.

블록을 사용하여 적은 코드로 동일한 작업을 실제로 수행 할 수 있지만 조금 더 고급입니다. 나는 여기에 들어 가지 않을 것이다.

NSNotificationCenter를 사용할 수도 있지만 개인적으로 꼭 필요한 경우가 아니면 사용하지 않으려 고합니다.

+0

좋은 대답입니다. 블록 사용에 대해 알고 싶습니다. 나 한테 뭔가 제안 해 줄래? –

+1

이 접근법에 대한 블록 사용의 요점은 위임 프로토콜을 생성하고이를 테이블 뷰 클래스에 전달하는 대신 블록 유형을 typedef하고 해당 유형의 블록을 테이블 뷰 클래스에 전달한다는 것입니다. 테이블 뷰 클래스가 "주"뷰 컨트롤러를 다시 호출해야 할 때 대리자 개체에서 대리자 메서드를 호출하는 대신 단순히 블록을 호출합니다. Objective-C 블록을 소개하는 가장 좋은 방법 중 하나는 http://thirdcog.eu/pwcblocks/입니다. – erikprice

+0

고맙습니다. 예를 들어, 셀 내에서 블록 속성을 만들 수 있습니다. 그런 다음 tableview 컨트롤러에서 해당 블록 속성에서 메서드를 설정할 수 있습니다. 그런 다음 셀에서 컨트롤러로 데이터를 전달할 때 셀에서 해당 블록 메서드를 호출 할 수 있습니다. 맞아? 특정 셀을 업데이트하는 데 사용할 수있는 행 인덱스는 어떻습니까? 블록 속성에 관해서는 복사 정책으로 정의하는 것이 옳은가요? 추신 나는 그것이 매우 좋기 때문에 당신의 대답을지지했다. –