2014-01-21 2 views
1

테이블보기 셀에 생성 된 버튼에 대한 태그를 설정해야합니다.
UISearchBar을 구현했으며 잘 작동합니다.UISearchBar의 버튼 태그 문제

문제는 내가
'button.tag = indexPath.row'을 설정하고 같은 있는 tableView 세포, 그 indexpath.row 변화를 필터링 한 후입니다.

모든 셀에 대해 행 번호를 일정하게 유지하는 방법이 있습니까?
다른 해결책이 있습니까?

: 나는 하나 UITableViewisFiltered에 여러 섹션이는 UISearchBar에 텍스트를 입력하기 시작했습니다 사용자를 나타내는 BOOL 값입니다.

내가 그렇게하는 한 가지 방법을 설명하고 cellForRowAtIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellId = @"CheckBoxedCell"; 
    // NSString *cellId = [NSString stringWithFormat:@"Section:%d Row:%d",indexPath.section,indexPath.row]; 
    CheckBoxedCellClass *cell = (CheckBoxedCellClass *)[self.tableViewContact dequeueReusableCellWithIdentifier:cellId]; 

    if(!cell) 
    { 
     NSArray *nib; 
     if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
     { 
      nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass" owner:self options:nil]; 
     } 
     else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
     { 
      nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass_iPad" owner:self options:nil]; 
     } 
      for (id object in nib) 
      { 
       if([object isKindOfClass:[CheckBoxedCellClass class]]) 
       { 
        cell = (CheckBoxedCellClass *)object; 
        break; 
       } 
      } 

      cell = [nib objectAtIndex:0]; 

    } 

     SaveCheckBoxedView *saveContact; 
     if(isFiltered == YES) 
     { 
      saveContact = [filterdArray objectAtIndex:indexPath.row]; 
      cell.nameLabel.text = saveContact.nameString; 
     } 
     else 
     { 
      saveContact = [mutableArray objectAtIndex:indexPath.row]; 
      cell.nameLabel.text = [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 
     } 

     //cell.nameLabel.text = saveContact.nameString; 

     cell.companyLabel.text = saveContact.companyString; 
     cell.invIdLabel.text = [NSString stringWithFormat:@"%d", saveContact.invitId]; 

     //set fonts 
     if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
     { 

      [cell.companyLabel setFont:[UIFont italicSystemFontOfSize:10.0]]; 
     } 
     else 
     { 

      [cell.companyLabel setFont:[UIFont italicSystemFontOfSize:14.0]]; 
     } 



    //handling check box 

    NSInteger rowNumber = 0; 
    for(NSInteger i = 0; i < indexPath.section ; i++) 
    { 
     rowNumber += [self tableView:self.tableViewContact numberOfRowsInSection:i]; 
    } 

    rowNumber += indexPath.row; 

    /*if([indexPath compare:self.lastIndexPath] == NSOrderedSame) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     NSString *finalIntId = [mutableArrayOfIds objectAtIndex:rowNumber]; 
     NSLog(@"Tagged checked button id = %@", finalIntId); 
     [arrayOfIds addObject:finalIntId]; 
    }*/ 

    UIButton *checkBox; 
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     checkBox = [[UIButton alloc]initWithFrame:CGRectMake(7, 8, 30, 30)]; 
    } 
    else 
    { 
     checkBox = [[UIButton alloc]initWithFrame:CGRectMake(15, 13, 30, 30)]; 
    } 

    [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; 
    [checkBox addTarget:self action:@selector(checkBoxClicked:event:) forControlEvents:UIControlEventTouchUpInside]; 
    if(isFiltered == YES) 
    { 
     checkBox.tag = ; 
    } 
    else 
    { 
     checkBox.tag = rowNumber; 
    } 
    [cell.contentView addSubview:checkBox]; 

    return cell; 
} 
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    if(isFiltered == YES) { 
     return Nil; 
    } else { 
     NSArray *toBeReturned = [NSArray arrayWithArray: 
           [@"A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|#" 
            componentsSeparatedByString:@"|"]]; 
     return toBeReturned; 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
    if (title == UITableViewIndexSearch) { 
     CGRect searchBarFrame = self.searchDisplayController.searchBar.frame; 
     [tableView scrollRectToVisible:searchBarFrame animated:YES]; 

     return -1; 
    } else { 
     NSInteger count = 0; 

     for (NSString *character in arrayOfCharacters) { 
      if ([character isEqualToString:title]) { 
       return count; 
      } 
      count ++; 
     } 
     return 0; 
    } 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if(isFiltered == YES) { 
     return 1; 
    } else { 
     return [arrayOfCharacters count]; 
     //return 1; 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if(isFiltered == YES) { 
     return [filterdArray count]; 
    } else { 
     //return [mutableArray count]; 
     return [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:section]] count]; 
    } 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    if ([arrayOfCharacters count] == 0) { 
     return @""; 
    } 

    return [NSString stringWithFormat:@"%@", [arrayOfCharacters objectAtIndex:section]]; 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if(searchText.length == 0) 
    { 
     isFiltered = NO; 
    } 
    else 
    { 
     isFiltered = YES; 
     filterdArray = [[NSMutableArray alloc] init]; 
     for (SaveCheckBoxedView *contact in mutableArray) 
     { 
      NSRange nameRange = [contact.nameString rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      if(nameRange.location != NSNotFound) 
      { 
       [filterdArray addObject:contact]; 
      } 
     } 
    } 
    [self.tableViewContact reloadData]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [filterdArray removeAllObjects]; 
    if(searchString.length > 0) 
    { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [search] %@", self.mySearchBar.text]; 
     for (NSString *key in arrayOfCharacters) 
     { 
      NSArray *matches = [objectsForCharacters[key] filteredArrayUsingPredicate:predicate]; 
      [filterdArray addObjectsFromArray:matches]; 
     } 
    } 
    return YES; 
} 
+0

질문이 명확하지 않습니다. 필터링하기 전에 버튼 태그를 원하십니까? 전체 cellForRowAtIndexPath 메소드를 게시 할 수 있습니까? – Rashad

+0

@Rashad cellForRowAtIndexPath의 전체 메소드를 추가했습니다. –

+0

무엇을 원하십니까? 버튼 태그는 필터링 후에도 동일하게 유지됩니까? – Rashad

답변

0

에서 https://github.com/kwylez/IndexedTable

의 도움으로 검색 구현 당신은 더 나은 방법을 찾을 수 있습니다.

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [filterdArray removeAllObjects]; 
    if(searchString.length > 0) 
    { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [search] %@", self.mySearchBar.text]; 
     for (NSString *key in arrayOfCharacters) 
     { 
      NSArray *matches = [objectsForCharacters[key] filteredArrayUsingPredicate:predicate]; 
      /****see bellow****/ 
      [filterdArray addObjectsFromArray:matches]; 
     } 
    } 
    return YES; 
} 

"일치"하는 각 개체의 행 번호를 찾으십시오. 그것은 당신의 단추의 꼬리표 일 것이다. filterdArray에 사전 배열을 만듭니다. 사전에 2 필드를 추가하십시오. 하나는 가치를 위해 다른 태그를위한 것입니다. in cellForRowAtIndexPath.

if(isFiltered == YES) 
{ 
    checkBox.tag = [filterdArray objectForKey: @"tag"] ; 
} 
else 
{ 
    checkBox.tag = rowNumber; 
}