2012-05-06 5 views
1

지난 토요일에 비슷한 질문을하고 있었지만 현명한 사람들이 바베큐 파티에 참석 한 것처럼 보입니다. 대답을 얻지 못했습니다.iOS : 현재 TableViewCell의 현재 컨트롤을 가리키는 방법

내 문제는 UITableViewCell에 UISwitch와 두 개의 UIButton을 배치해야하며 UISwitch가 상태를 변경하면이 UIButton이 나타나거나 사라져야한다는 것입니다. 이 세포들은 어느 곳을 탐색하지되며, 따라서 나는 단지 정보 프리젠 테이션을 사용하고,에서

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

enter image description here

를 사용하지 않는 - (있는 UITableViewCell *)있는 tableView : (jQuery과 *)있는 tableView의 cellForRowAtIndexPath : (NSIndexPath *) indexPath methos 필요한 컨트롤을 프로그래밍 방식으로 만들고 각각에 태그 값과 액션 @selector를 할당했습니다.

다른 방법으로 현재 행에서 itemID를 가져 오는 방법을 관리했습니다. 마찬가지로이 방법 :

-(void)setItem:(UISwitch*)sender 
{ 
int n; 
UITableViewCell *cell; 
if(sender.tag==9001) 
{ 
    cell=((UITableViewCell*)[sender superview]); 
    n=([self.tableView indexPathForCell:cell].row); 
} 
item=[self.arr objectAtIndex:n]; 

NSDate *today=[NSDate date]; 
NSDateFormatter *formatter =[[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterMediumStyle]; 
NSString *now =[formatter stringFromDate:today]; 

if(sender.on) 
{ 
    DBAccess *access=[[DBAccess alloc]init]; 
    [access setItemON:item.itemID date:now]; 
    //qualityBtn.hidden=NO; 
    [qualityBtn setTitleColor:[UIColor blackColor] forState:normal]; 
    [qualityBtn setTitle:@"UNDEF" forState:normal]; 
} 
else 
{ 
    DBAccess *access=[[DBAccess alloc]init]; 
    [access setItemOFF:item.itemID]; 
} 
} 

그래서, 내 문제는이 방법이 작동 할 때이다는 qualityBtn : 다른 세포들도 등의 제목을 받고,하지만 난 전류 제어에 현재 버튼이 메소드의 로직으로 인해 변경됩니다 필요 . 그래서 현재 셀에 배치 된 컨트롤 만 변경하고 다른 셀은 생략한다는 점을 메서드에서 가리키는 방법입니다.

미리 감사드립니다.

EDIT :

@property (비 원자 강한)있는 UIButton * qualityBtn; 예, 글로벌입니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
item=[self.arr objectAtIndex:[indexPath row]]; 

static NSString *CellIdentifier = @"Cell"; 
ItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


self.switchView = [[UISwitch alloc] initWithFrame:CGRectMake(7, 8, 79, 27)]; 
[switchView addTarget:self action:@selector(setItem:) forControlEvents:UIControlEventValueChanged]; 
[switchView setTag:9001]; 


qualityBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[qualityBtn addTarget:self 
       action:@selector(setQuality:) 
forControlEvents:UIControlEventTouchDown]; 

qualityBtn.frame = CGRectMake(236, 8, 72, 21); 
qualityBtn.titleLabel.font = [UIFont systemFontOfSize:12]; 
[qualityBtn setTag:9002]; 

itemMemoBtn=[UIButton buttonWithType:UIButtonTypeCustom]; 
[itemMemoBtn addTarget:self 
       action:@selector(setItemMemo:) 
     forControlEvents:UIControlEventTouchDown]; 
itemMemoBtn.frame = CGRectMake(274, 43, 34, 30); 
[itemMemoBtn setTag:9003]; 
[itemMemoBtn setImage:[UIImage imageNamed:@"comment-icon"] forState:normal]; 

lblDate=[[UILabel alloc]initWithFrame:CGRectMake(14, 34, 72, 21)]; 
lblDate.font=[UIFont systemFontOfSize:9]; 
[lblDate setTag:9003]; 

[cell addSubview:switchView]; 
[cell addSubview:qualityBtn]; 
[cell addSubview:itemMemoBtn]; 
[cell addSubview:lblDate]; 
[cell setIndentationWidth:45]; 
[cell setIndentationLevel:1]; 

lblDate.text=item.date; 
cell.lblKM.text=item.kmRef; 
cell.lblInfo.text=item.info; 
if(item.dateFrom.length>0 && item.dateUntil.length>0) 
{ 
    cell.lblYears.text=[NSString stringWithFormat:@"%@ - %@",item.dateFrom,item.dateUntil]; 
} 
if(item.dateUntil.length<1) 
{ 
    cell.lblYears.text=item.dateFrom; 
} 

if(item.mintMark.length<1) 
{ 
    //cell.mintmarksImageView.hidden=YES; 
} 
cell.lblMintmarks.text=item.mintMark; 

if(item.memo.length>0) 
{ 
    [email protected]"YES"; 
} 
else 
{ 
    [email protected]"NO"; 
} 

cell.lblRarity.text=item.rarity; 

if(item.isAvailable==0) 
{ 
    [switchView setOn:NO]; 
    //qualityBtn.hidden=YES; 
    //lblDate.hidden=YES; 
    [email protected]"UNDEF"; 
} 
else { 
    [switchView setOn:YES]; 
    // lblDate.hidden=NO; 
    NSString *quality=nil; 
    switch(item.quality) 
    { 
     case 1: 
     { 
      [email protected]"UNDEF"; 
      break; 
     } 
     case 2: 
     { 
      [email protected]"G"; 
      break; 
     } 
     case 3: 
     { 
      [email protected]"VG"; 
      break; 
     } 
     case 4: 
     { 
      [email protected]"F"; 
      break; 
     } 
     case 5: 
     { 
      [email protected]"VF"; 
      break; 
     } 
     case 6: 
     { 
      [email protected]"XF"; 
      break; 
     } 
     case 7: 
     { 
      [email protected]"UNC"; 
      break; 
     } 
     case 8: 
     { 
      [email protected]"PROOF"; 
      break; 
     } 
    } 
    [qualityBtn setTitleColor:[UIColor blackColor] forState:normal]; 
    [qualityBtn setTitle:quality forState:normal]; 
} 

return cell; 
} 
+0

실제로 qualityBtn을 할당 한 코드를 표시 할 수 있습니까? 제공된 스 니펫에서 현재 개체와 관련이없는 일종의 전역 개체 인 것처럼 보입니다. –

+0

잠깐 ... – NCFUSN

+0

업데이트를 참조하십시오 – NCFUSN

답변

1

UITableViewCell 하위 클래스를 확장하고 스위치와 버튼에 대한 속성을 제안합니다. 이런 식으로 뭔가 : cellForRowAtIndexPath에서

@interface YourCustomCell: UITableViewCell 
@property(strong,nonatomic) UISwitch *switchView 
@property(strong,nonatomic) UIBtton *qualityBtn 
@property(strong,nonatomic) UIBtton *memoBtn 
@end 

: 당신이 다음과 같은 일을 할 것입니다 : 당신의 setItem에서 지금

cell.switchView = [[UISwitch alloc] initWithFrame:CGRectMake(7, 8, 79, 27)]; 
[cell.switchView addTarget:self action:@selector(setItem:) forControlEvents:UIControlEventValueChanged]; 
[cell.switchView setTag:9001]; 
/* setting the other properties is not shown */ 

: 메소드 할 수 있습니다

cell.qualityBtn 
cell.memoBtn 
을 수행하여 올바른 버튼 간단한 액세스

그러나 스위치 상태를 추적하는 일종의 모델을 업데이트해야 사용자가 테이블을 스크롤하고 셀이 할당 취소되고 다시 할당되면 셀이 올바른 상태 (단추 표시 여부)로 위치합니다. 가장 단순한 것은 셀의 NSIndexPath를 키로 가지는 NSDictionary 일 것입니다.

이 정보가 도움이되기를 바랍니다.

+0

유망한 소리. 나는 그것을 지금 시도 할 것이다. – NCFUSN

+0

셀에 컨트롤을 설정하고 IBOutlets를 사용해야한다는 것을 의미합니까? – NCFUSN

+0

IB에서보기를 빌드하려면 속성을 IBOutlets로 표시해야합니다 (예). 그리고 XIB 파일/스토리 보드에 연결해야합니다. –

2

대리자 메서드에서 셀에 하위 뷰를 추가하지 마십시오. UITableViewCell (예 : MCMyCustomTableViewCell의 경우)을 하위 클래스로 만들어야하므로 dequeue 메서드를 통해 재사용 할 수 있도록 요소가 만들어집니다. 완료되면 셀에 속성이있는 변수를 만듭니다 (예 : @property (nonatomic, strong) NSInteger cellIndex, 당신은 당신의 cellForRowAtIndexPath을 할 때 기입해야합니다) ... 상태가 변경 또는 버튼을 누를 때 컨트롤러에 버튼에 목표를 추가하고 수행

- (void)didClickButton:(UIButton *)sender{ 
    NSInteger index = [(MCMyCustomTableViewCell *)sender.superview cellIndex]; 
    // Place for your code here 
} 

과보다 스위치와 동일 :)

+0

그렇다면 스토리 보드의 셀에 스위치를 놓고 아이템 클래스에서 스위치를 사용할 수 있습니까? – NCFUSN

+0

솔직히 말해서 스토리 보드 나 NIX (XIB) 파일을 사용하지 않고 코드를 다룰 때 개발자가 여러 명일 때 코드베이스를 관리하는 것이 훨씬 쉽습니다. – Ondrej

+0

먼저 살펴 봅니다. 여기 내 자습서 : http://www.xprogress.com/post-32-uinavigationbar-tutorial-with-uitable-pushing-detail-view-using-didselectrowatindexpath-and-all-xcode-example-source-files/ 그 것이다. 프로그래밍 방식으로 테이블을 작성하는 방법을 알려줍니다. 앞으로 이야기 게시판을 사용할 예정이라하더라도 어떻게 작동하는지 알기가 매우 편리 할 것입니다. – Ondrej

관련 문제