联系应用程序 - 搜索并应用选择样式

时间:2014-04-03 06:47:32

标签: ios objective-c uitableview

[已编辑发布]

为了练习,我开发了一个没有任何后端的联系人应用程序。我只跟着一个NSMutableArray来维护UITableView中显示的联系人。

目标;

  • 喜欢搜索联系人(例如:爸爸),用户在文本字段中输入名称并按下按钮
  • 在按钮操作中,检查Dad是否包含Mutable数组中的哪一个。
    • 如果存在,那么它肯定会在tableView中显示为一行。所以我想把selectionStyle放到那一行。
    • 如果搜索文本更改意味着(例如:妈妈),则还原以前的selectionStyle并应用于该行(妈妈)。
    • 如果不存在,标签将“不存在”标记为文本。 (完成!)。

IBAction为:

-(IBAction)actionSearchNameInTable:(id)sender{
if([myContactsArray containsObject:txtForContactName.text]){
myTable.tag=5;
NSInteger tempIndex=[myContactsArray indexOfObject:txtForContactName.text];    
NSIndexPath *tempIndexPath=[NSIndexPath indexPathForRow:tempIndex inSection:0];   
[self tableView:myTable didSelectRowAtIndexPath:tempIndexPath]; //broke here
NSLog(@"Call Passed!"); 
}
}

didSelectRowAtIndexPath方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath{
if(myTable.tag==5){
NSLog(@"called done!");
//Here i like to select that row and apply selectionStyle or favorite background color for that cell, idea?.
myTable.tag=0;
}

这些都只是我申请的其他部分。我确信,Delegate和Datasource连接正确。

4 个答案:

答案 0 :(得分:2)

您正在呼叫didDeselectRowAtIndexPath而不是didSelectRowAtIndexPath

我认为你的班级没有实施didDeselectRowAtIndexPath,这就是崩溃的原因。

并提出另一个问题:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(cell.tag==100)
    {
        cell.contentView.backgroundColor=[UIColor grayColor];

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

    UITableViewCell *cell=[tblviw cellForRowAtIndexPath:indexPath];
    cell.tag=100;
    cell.contentView.backgroundColor=[UIColor grayColor];
}

答案 1 :(得分:0)

请尝试查看我编辑的答案......

-(IBAction)actionSearchNameInTable:(id)sender{
    if([myContactsArray containsObject:txtForContactName.text]){
    myTable.tag=5;
    NSInteger tempIndex=[myContactsArray indexOfObject:txtForContactName.text];
    NSLog(@"TEmp index:%i",tempIndex);
    NSIndexPath *tempIndexPath=[NSIndexPath indexPathForRow:tempIndex inSection:0];
    NSLog(@"Temp IP:%@",tempIndexPath);
    [self tableView:myTable didSelectRowAtIndexPath:tempIndexPath]; //Change here......
    NSLog(@"Call Passed!"); 
}
}

答案 2 :(得分:0)

改变这个:

-(IBAction)actionSearchNameInTable:(id)sender{
if([myContactsArray containsObject:txtForContactName.text]){
myTable.tag=5;
NSInteger tempIndex=[myContactsArray indexOfObject:txtForContactName.text];
NSLog(@"TEmp index:%i",tempIndex);
NSIndexPath *tempIndexPath=[NSIndexPath indexPathForRow:tempIndex inSection:0];
NSLog(@"Temp IP:%@",tempIndexPath);
[self tableView:myTable didSelectRowAtIndexPath]; //broke here
NSLog(@"Call Passed!"); 
}
}

对于自定义选择背景,请在 cellForRowAtIndexPath 中执行此操作。

UIView *customColorView = [[UIView alloc] init];
customColorView.backgroundColor = [UIColor colorWithRed:180/255.0
                                                  green:138/255.0
                                                   blue:171/255.0
                                                  alpha:0.5];
cell.selectedBackgroundView =  customColorView;

希望这会有所帮助.. :)

修改

didSelectRowAtIndexPath是代表。只有在用户交互发生时才会调用它。几天前我面临同样的问题。我在cellForRowAtIndexPath做了。要选择一行,请执行以下操作:

if ([[myContactsArray objectAtIndex:indexPath.row] isEqualToString:txtForContactName.text]) {
        [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}

答案 3 :(得分:0)

搜索是否存在给定文本的操作:

-(IBAction)actionSearchNameInTable:(id)sender{
 [txtForContactName resignFirstResponder];
if([myContactsArray containsObject:txtForContactName.text]){
    myTable.tag=5;
    [myTable reloadData];
}
}

在cellForRowAtIndexPath中:

//Better delegate to apply selection style
//Code after dequeue...
myTableCell.textLabel.text=[myContactsArray objectAtIndex:indexPath.row];
myTableCell.imageView.image=[myContactsPhotosArray objectAtIndex:0];
{
myTableCell.textLabel.text=[myContactsArray objectAtIndex:indexPath.row];
myTableCell.imageView.image=[myContactsPhotosArray objectAtIndex:0];
if(myTable.tag==5){
NSLog(@"Ready to apply selectionStyle");
if ([[myContactsArray objectAtIndex:indexPath.row] isEqualToString:txtForContactName.text]) {
[myTable selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
myTable.tag=0;           
}
}
return myTableCell;
}