在iOS中制作UISearchBar

时间:2013-12-15 00:55:20

标签: ios uisearchbar

我有这段代码:

for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) { 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 
}

我有一个搜索栏,用于过滤搜索对象,并在单击时在单元格上添加复选标记。但是,如果您搜索并单击第一个单元格,则会将其检出。但是,如果删除搜索文本,则复选标记会显示在第一个单元格上,而不是我检查的单元格上。这是一段显示以下内容的视频: https://docs.google.com/file/d/0B1Of4oDADQCQZkF0aGdhdmF0VjA/edit 我在哪里将上面的代码放在下面的代码中,以便复选标记与选定的单元格保持一致?

#import "MSAddFriendsViewController.h"


@interface MSAddFriendsViewController ()

@end

@implementation MSAddFriendsViewController




- (void)viewDidLoad
{
[super viewDidLoad];
PFQuery *query = [PFUser query];
[query orderByAscending:@"username"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
        NSLog(@"Error %@, %@", error, [error userInfo]);

    }
    else {
        self.allUsers = objects;
        [self.tableView reloadData];
    }
}];

self.currentUser = [PFUser currentUser];


self.searchUsers.delegate = self;



}


- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if (searchText.length == 0) {
    self.userResults = nil;
    [self.tableView reloadData];
    return ;
}
self.userResults = [NSMutableArray array];
for (PFUser *user in self.allUsers)  {
    if ([user.username rangeOfString:searchText
                          options:(NSAnchoredSearch |   NSCaseInsensitiveSearch)].location == 0) {
        [self.userResults addObject:user];
    }
}
[self.tableView reloadData];

}



#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:  (NSInteger)section
{

if (self.userResults != nil) {
    return [self.userResults count];
}
// Return the number of rows in the section.
return [self.allUsers count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];




PFUser *user;
if (self.userResults != nil) {
    user = [self.userResults objectAtIndex:indexPath.row];
} else {
    user = [self.allUsers objectAtIndex:indexPath.row];
}
cell.textLabel.text = user.username;





return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
PFRelation *friendsRelation = [self.currentUser relationforKey:@"friendsRelation"];
PFUser *user = [self.allUsers objectAtIndex:indexPath.row];
[friendsRelation addObject:user];
[self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (error) {
        NSLog(@"Error %@ %@", error, [error userInfo]);

    }    }];



}


@end

有人可以更正上面的代码吗?

1 个答案:

答案 0 :(得分:1)

第一个代码块只是取消选择所有选定的行。这不是您的问题的解决方案。您的代码通常需要纠正一些基本问题...

首先关闭 - 您需要保留所选单元格的数组,并在索引完整(非搜索)表时编制索引。例如,如果搜索栏中有文本并且选择了第一行,则所选单元格数组还应指示当前和当前不可见的行的选择布尔值,并按顺序执行。

其次 - 您需要在cellForRowAtIndexPath:方法中在单元格的附件视图中显式设置复选标记,以指示您选择的单元格。清除搜索栏后第一个单元格中有复选标记的唯一原因是重新加载表格是因为单元格被重用(即[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath])。

通过解决这些第一和第二个问题,你应该有一个好的开始...当你没有搜索时,所选择的单元格数组应该包含适当顺序的所有单元格的相应选择布尔值;在搜索时,您必须按照基于搜索文本过滤表格的相同方式过滤选定的单元格数组。而不是在didSelectRowAtIndexPath:中添加复选标记,最好只是指示在所选单元格数组中选择了单元格,然后重新加载表格以显示相应的复选标记。