2012-01-11 5 views
0

내가 눌렀을 때 셀을 강조 표시하고 강조 표시를 해제하기 위해 내 tableView의 오른쪽 구석에 UIBarButtonItem을 만들려고합니다.UITableViewCell을 얻는 방법은 UIBarButtonItem을 탭하여 배경색을 변경 하시겠습니까?

사용자가 버튼을 누르면 셀 범위가 흰색에서 노란색으로 바뀝니다.

나는 그 버튼을 누를 때마다 앱이 다운되기 때문에 그렇게하지 못하고있다.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIBarButtonItem *barButton; 
    barButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"high.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(colorCells:)] autorelease]; 
    self.navigationItem.rightBarButtonItem = barButton; 
} 

그리고 여기 셀 범위 강조하기 위해 :

- (void) colorCells:(id)sender 
{ 
    UITableViewCell *cell; 
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
     cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
     cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

    } 
    else { 
     cell.imageView.image = nil; 
     cell.backgroundColor = [UIColor whiteColor]; 
    } 
} 

내가 실패 오전

여기에 내가 버튼을 만들기 위해 사용하고 코드인가? 그것은 잘 작동해야합니다. 또는? 내가 놓친 게 있니? 뷰는 UITableViewController입니다. 지금은 충돌하지 않는

- (void) colorCells:(id)sender{ 
    UITableViewCell *cell; 
    NSInteger nSections = [self.tableView numberOfSections]; 
    for (int j=0; j<nSections; j++) { 
     NSInteger nRows = [self.tableView numberOfRowsInSection:j]; 
     for (int i=0; i<nRows; i++) { 
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:j]; 
      cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
     } 
     NSString *cellValue = cell.textLabel.text; 
     if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
      cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
      cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

     } 
     else { 
      cell.imageView.image = nil; 
      cell.backgroundColor = [UIColor whiteColor]; 
     } 
     [self.tableView reloadData]; 

    } 
} 

을,하지만 너무 배경 색상하지 않습니다

편집

나는 그렇게처럼 내 코드를 수정했습니다. 어떤 아이디어?

+0

[self.tableView beginUpdates]를 추가하십시오. 및 [self.tableView endUpdates]; 끝에 – Novarg

+0

여전히 선택한 셀을 색칠 수 없습니다. : S – Phillip

답변

1

셀의 텍스트 배경색을 매우 낮게 지정하고 있습니다. 셀을 강조 표시해야한다고 결정하는 것은 무엇입니까? 그것은 바뀌 었습니까? 분명히 배경의 색은 데이터 소스에있는 개체의 특정 속성에 해당합니다. 보다 견고한 접근 방법은 클래스의 NSMutableIndexSet 속성을 사용하여 행 인덱스 세트를 추적하는 것입니다. 행 인덱스는 막대 단추를 가볍게 두드리면 강조 표시해야합니다.

이 예제를 고려하십시오. rowsToHighlight은 클래스에 선언 된 NSMutableIndexSet의 인스턴스이고 강조 표시가 필요한 행의 인덱스로 채워져 있다고 가정합니다. 제공된 색인 경로가 rowsToHighlight의 구성원인지에 따라 셀의 배경색을 조정하려면 -tableView:willDisplayCell:forRowAtIndexPath:을 구현해야합니다.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self.rowsToHighlight containsIndex:indexPath.row]) 
    { 
     cell.backgroundColor = [UIColor yellowColor]; 
    } 
} 

그런 다음 모음 단추에 의해 발사되는 방법에있어서, 단지 애니메이션을 다시로드 할 수있는 테이블을 얻을 수 빈 업데이트 블록을한다.

- (void)colorCells:(id)sender 
{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} 
+0

글쎄, 당신의 대답을 주셔서 감사합니다. 나는 몇 가지 질문이있어. NSMutableIndexSet 특정 섹션에서 특정 이름을 포함하는 셀만 강조 표시하려면 (행을 추가하고 정렬 할 때 변경할 수 있음) 하이라이트하려는 셀을 어떻게 알 수 있습니까? 배경색을 처리하기위한 버튼을 만들고 싶었습니다. 탭을 할 때 셀 배경이 노란색이어야합니다. 다시 탭하면 흰색이 다시 나타납니다. – Phillip

+0

그건 내 요점이야. 어떤 종류의 개체를 사용하여 테이블보기를 채우고 있습니까? 셀을 강조 표시해야하는지 여부를 나타내는 'BOOL'을 노출하는 일부 NSObject 클래스 인 경우 이는 매우 간단합니다. 객체 자체는 강조 표시해야하는지 결정하는 데 필요한 모든 논리를 캡슐화 할 수 있습니다. 테이블 뷰 데이터 소스 메소드의 문자열을 비교하는 것은 좋지 않습니다. –

+0

나는'NSArray' &'NSDictionary'를 사용하여 my tV를 채 웁니다. 미안 점을 얻지 못하면서이 개발자 세상에 새로 왔어. 그래서 당신이 방금 쓴 것은 나에게 조금 혼란 스러울지도 모른다! – Phillip

0

테이블 뷰에 포함 된 테이블 뷰를 다시로드하라는 지시가 없으면 셀이 다시 그려지지 않습니다. 여러 가지 방법 중 하나로이 작업을 수행 할 수 있습니다. [someTableView reloadData] 또는 one of these methods을 고려해 볼 수 있습니다.

또한 셀 개체가 테이블보기에있는 개체가 아닙니다. 다음과 같이 고려할 수 있습니다.

- (void) colorCells:(id)sender 
{ 
    UITableViewCell *cell; 

    //grab a cell 
    cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:someRow inSection:someSection]]; 
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
     cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
     cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

    } 
    else { 
     cell.imageView.image = nil; 
     cell.backgroundColor = [UIColor whiteColor]; 
    } 

    //perhaps you need to reload the table as well 
    [self.tableView reloadData]; 
} 
+0

3 개의 개별 배열이 있고 각각 가변 개수의 셀을 포함하는 경우'cellForRowAtIndexPath'는 어떻게 작동합니까? (즉,'FirstArray' = 13 개체,'SecondArray' = 45 개체,'ThirdArray' = 20 개체) 어떤 경로를 취해야합니까? – Phillip

+0

테이블에 한 번에 하나의 배열을 표시하고 있습니까, 아니면 각 배열이 테이블의 일부입니까?인덱스 경로는 테이블의 델리게이트에게 어떤 행과 어떤 섹션이 테이블을 제공하는지 알려줍니다. – Moshe

+0

아니요, 각 배열은 테이블의 일부입니다. 세 번째 섹션은 첫 번째 섹션이 'FirstArray'에 속하며 두 번째 섹션은 'SecondArray'에 속하며 세 번째 섹션은 'ThirdArray'에 속합니다. 그러면'indexPath'는 무엇이되어야할까요? – Phillip

관련 문제