2012-03-06 2 views
3

최신 SDK 및 XCode 4.2로 iOS 4 응용 프로그램을 개발하고 있습니다.UIButton이있는 사용자 정의 UITableViewCell : 어떤 버튼을 클릭 했습니까?

나는 섹션이 있고 사용자 정의가 UITableViewCellUITableView입니다. 모든 셀에는 UIButton이 있으며이 모든 단추는 UIControlEventTouchUpInside에 대해 동일한 대상을 갖습니다.

이 내 코드입니다 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* cellIdentifier = @"CalendarCell"; 

    CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil]; 

     for(id currentObject in topLevelObjects) 
     { 
      if ([currentObject isKindOfClass:[CalendarEventCell class]]) 
      { 
       cell = (CalendarEventCell *)currentObject; 
       [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside]; 
       break; 
      } 
     } 
    } 
... 
} 

사용자의 터치가 버튼 안에 은 어떻게하는 부와 행에 클릭 된 셀이었다 알 수 있는가?

+1

해당 버튼에 태그를 설정할 수 있습니다.해당 태그 번호를 사용하면 클릭 한 버튼을 찾을 수 있습니다. – Ganesh

+0

여기 좀보세요 : http://stackoverflow.com/questions/510393/how-to-pass-a-variable-to-a-uibutton-action – pkyeck

답변

6

버튼에 태그를 추가하십시오. 예를 들면 :

CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) 
{ 
    NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil]; 

    for(id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:[CalendarEventCell class]]) 
     { 
      cell = (CalendarEventCell *)currentObject; 
      [cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside]; 
      break; 
     } 
    } 
} 
cell.addToCalendarButton.tag = ((indexPath.section & 0xFFFF) << 16) | 
           (indexPath.row & 0xFFFF); 

당신은 @selector(addEventToiCal:)에 선택을 변경하고 -(void) addEventToiCal:(UIButton *)sender에 방법을 업데이트해야합니다.

그런 대신 컨트롤러 자체에 목표를 설정하는 셀에 방법에 다음과 -addEventToiCal:

if (!([sender isKindOfClass:[UIButton class]])) 
    return; 
NSUInteger section = ((sender.tag >> 16) & 0xFFFF); 
NSUInteger row  = (sender.tag & 0xFFFF); 
NSLog(@"Button in section %i on row %i was pressed.", section, row); 
+0

또한 메서드를 선언 할 수 있습니다'- (void) addEventToiCal : (UIButton *) sender'를 누른 다음 첫 번째 줄을 제거하십시오. –

+0

@MisterJack 나는 그런 식으로 그것을 토론했다. 당신이 생각보다 두 번째로 보였으므로, 귀하의 제안을 반영하도록 답변을 업데이트했습니다. –

+0

답변 해 주셔서 감사합니다. indexPath.section 및 indexPath.row가 필요합니다. – VansFannel

3

설정 버튼의 목표 같은 것을 추가 할 수 있습니다 방법으로 셀에 대한 위임 프로토콜을 만들 tappedButton:(UIButton *)button inCell:(UITableViewCell *)cell과 같이 컨트롤러를 셀의 위임자로 설정하십시오. 메서드를 위임하는 대상 메서드 호출에서.

컨트롤러의 대리자 메서드 구현에서 UITableViewtableView:indexPathForCell:을 호출하여 셀 NSIndexPath을 찾을 수 있습니다. 당신이 버튼에 방법을 추가 할 때 cellForRowAtIndexPath 방법 같은 버튼

+0

'tableView : indexPathForCell :'을 호출하는 대신'tappedButton :'메소드로 섹션과 행을 전달하는 것이 더 쉽습니다. – VansFannel

+0

그러면 셀의 'NSIndexPath'를 ivar/속성으로 유지해야합니다. 그러나 추가로 관리해야하는 데이터를 불필요하게 복제하고 있습니다. 셀이 죽으면 해제하고, 예를 들어 셀을 업데이트합니다. 위의 셀은 추가되거나 제거됩니다. 그러나'tableView : indexPathForCell :'을 실행하여 성능 문제가 발생하는 경우는 거의 없지만 "바로 가기"를 사용할 수 있습니다. – macbirdie

2

지정 태그 값은

  1. cell.addToCalendarButton.tag=indexPath.row
  2. 또한 보낸 사람이 그렇게 같은 버튼에 방법을 지정 보냅니다.

    [cell.addToCalendarButton addTarget : 자체 액션 : @selector (addEventToiCal :) forControlEvents : UIControlEventTouchUpInside]; 당신의 방법에서

  3. 처럼 관련 행을 읽어

    - (IBAction를) addEventToiCal (ID)는 송신기 { NSLog가 ([발신자 태그] "현재 행 %의 D입니다");

지금 섹션에 대해 다음 다음

- (void)addEventToiCal:(id)sender event:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 

    NsLog("value of indePath.section %d ,indexPath.row %d",indexPath.section,indexPath.row); 

} 

그런 cellforRowAtIndexPath에 당신의 방법을 할당과 같은 일을 할 indexPath하려면}

.

[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal:event:)forControlEvents:UIControlEventTouchUpInside]; 
+0

답변 해 주셔서 감사합니다. indexPath.section 및 indexPath.row가 필요합니다. – VansFannel

0

BNRXIBCell은 iOS 5 이상에서 탁월한 솔루션입니다. 그것은 서브 클래스로 만들려는 UITableViewCell 서브 클래스로, 셀 서브 뷰의 액션 메시지를 컨트롤러로 전달합니다.

관련 문제