2013-12-15 72 views
-1

我有這樣的代碼:使一個UISearch酒吧iOS中

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

第一個代碼塊只是取消選擇所有選定行的。這不是解決您的問題的方法。有幾個基本問​​題與一般需要修正你的代碼...

第一關 - 你需要保持選定的單元陣列,索引爲全(非搜索)表索引。例如,如果搜索欄中有文本,並且第一行被選中,那麼您選擇的單元格數組也應該指示當前不可見的前一行和後一行的選擇布爾值,並且全部按順序執行。

其次 - 你需要明確設置你的cellForRowAtIndexPath期間在你的細胞附件觀點複選標記:方法,以表明您選定的單元格。你必須在第一個單元格勾選搜索欄被清除,該表的重新載入是因爲細胞的被重用(即[:CellIdentifier forIndexPath:indexPath的tableView dequeueReusableCellWithIdentifier])後的唯一原因。

通過固定這些第一和第二的問題,你應該有一個良好的開端...當你不搜索,選擇的單元陣列應包含適當的選擇布爾在正確的順序所有的細胞;並且在搜索時,必須按照與基於搜索文本過濾表格的方式相同的方式過濾所選單元格數組。而不是在didSelectRowAtIndexPath:中添加複選標記,您最好指出在所選單元格數組中選擇了單元格,然後重新加載表格以顯示相應的複選標記。

+0

我是新來的目標c,所以你可以寫出代碼? – MicahKE

+0

嘿,對不起,這是很多代碼寫出來的,我沒有時間爲你寫,但如果你花一些時間來制定我給你的指示,我保證你會走向正確的方向。 –

+0

好的我得到了代碼 – MicahKE