2012-05-12 5 views
0

내 수퍼 뷰의보기 컨트롤러에 대한 참조를 가져 오는 방법이 있습니까? 지난 몇 달 동안이 작업이 필요한 몇 가지 사례가 있었지만이를 수행하는 방법을 알지 못했습니다. 내 말은, 사용자 지정 셀에 사용자 지정 단추가 있고 현재 사용중인 셀을 제어하는 ​​테이블보기 컨트롤러에 대한 참조를 얻으 려한다면 거기에 대한 코드 조각이 있습니까? 아니면 더 나은 디자인 패턴을 사용하여 해결해야 할 부분입니까?수퍼 뷰의보기 컨트롤러에 대한 참조를 얻는 방법은 무엇입니까?

감사합니다.

답변

0

나는이 질문에 나는 내가 TableViewController 셀의 버튼을 탭하고 알 수있는 방법 그들에 버튼과 사용자 정의 세포를 가지고있는 상황에서,의 생각을 물었을 때. 최근 책 "아이폰 OS 조리법"을 읽어, 나는 솔루션을 가지고 :

-(IBAction)cellButtonTapped:(id)sender 
{ 
NSLog(@"%s", __FUNCTION__); 
UIButton *button = sender; 

//Convert the tapped point to the tableView coordinate system 
CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tableView]; 

//Get the cell at that point 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:correctedPoint]; 

NSLog(@"Button tapped in row %d", indexPath.row); 
} 

또 다른 해결책, 더 깨지기 쉬운 조금 (하지만 간단)이 될 것입니다 :

- (IBAction)cellButtonTapped:(id)sender 
{ 
    // Go get the enclosing cell manually 
    UITableViewCell *parentCell = [[sender superview] superview]; 
    NSIndexPath *pathForButton = [self.tableView indexPathForCell:parentCell]; 
} 

그리고 대부분의 재사용을 당신의있는 UITableViewController 클래스에 다음 jQuery과

- (NSIndexPath *)prp_indexPathForRowContainingView:(UIView *)view 
{ 
    CGPoint correctedPoint = [view convertPoint:view.bounds.origin toView:self]; 
    return [self indexPathForRowAtPoint:correctedPoint]; 
} 

의 범주에이 방법을 추가하는 것, 바로 이것을 사용 :

- (IBAction)cellButtonTapped:(id)sender 
{ 
    NSIndexPath *pathForButton = [self.tableView indexPathForRowContainingView:sender]; 
} 
3

버튼에는 superviews보기 컨트롤러에 대해 알 필요가 없습니다.

그러나 단추가 세부 사항을 알지 못하는 메시지를 실제로 보내야하는 경우 위임을 사용하여 위임 단추에 원하는 메시지를 보낼 수 있습니다.

MyButtonDelegate 프로토콜을 만들고 해당 프로토콜을 준수하는 모든 사람이 구현해야하는 메서드 (콜백)를 정의합니다. 선택적 방법도 사용할 수 있습니다.

그런 다음 버튼 @property (weak) id<MyButtonDelegate>에 속성을 추가하면 프로토콜에 적합한 모든 종류의 클래스를 위임자로 설정할 수 있습니다.

이제보기 컨트롤러는 MyButtonDelegate 프로토콜을 구현하고 자체를 대리인으로 설정할 수 있습니다. 뷰 컨트롤러에 대한 지식이 필요한 코드 부분은 위임 메서드 (또는 메서드)에서 구현해야합니다.

이제 뷰는 프로토콜 메시지를 해당 대리인에게 보낼 수 있으며 (누가 무엇인지 알지 못함) 대리인이 해당 단추에 대해 적절한 작업을 수행 할 수 있습니다. 이렇게하면 같은 버튼이 어디에서 사용 되는가에 의존하지 않기 때문에 재사용 할 수 있습니다.

+3

스폿이 켜져 있습니다. 일상적으로 침해당하는 가장 큰 문제는 '우려의 분리'입니다. –

+0

감사합니다. David! 당신의 대답은 또한 iOS에서 위임 패턴과 느슨한 결합, 재사용 가능한 코드 작성에 대해 더 많이 이해하게했습니다. – Giovanni

-1

보기 컨트롤러의 수퍼 뷰가 어떤 클래스인지 알면 하위 뷰 배열을 반복하고 수퍼 클래스를 유형 검사합니다.

예 :

UIView *view; 

for(tempView in self.subviews) { 

    if([tempView isKindOfClass:[SuperViewController class] ]) 

     { 
      // you got the reference, do waht you want 

     } 


    } 
관련 문제