[英]Tracking UITableViewCells
我有一個有很多任務的待辦事項清單應用程序。 每個任務都有一個UITableViewCell。 敲擊每個表視圖單元格后,它將創建一個視圖控制器,並在該行的索引路徑的屬性處添加任務。 這些視圖控制器都存儲在NSDictionary中。 這是我剛才說的代碼表示形式:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detailVC;
if (![self.detailViewsDictionary.allKeys containsObject:indexPath]){
detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
[self.detailViewsDictionary setObject:detailVC forKey:indexPath];
detailVC.context = self.managedObjectContext;
}else{
detailVC = self.detailViewsDictionary[indexPath];
}
Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailVC.testTask = task;
[[self navigationController] pushViewController:detailVC animated:YES];
NSLog(@"%@", self.detailViewsDictionary);
}
因此,這種創建唯一視圖控制器並使用特定鍵存儲它們的方法幾乎總是可行的。 當我刪除或移動視圖控制器時出現問題:
我的印象是,當您向下滾動(出隊)時,單元格將被回收。 這意味着用數字標識符標記每個單元將導致同一標識符的多個單元。
另外,如果您為每個視圖控制器存儲了一個indexPath鍵,那么如何確保該鍵未設置為兩個視圖控制器。 例如。 假設您有4個單元格,即4個視圖控制器。 您刪除單元格3。單元格4下移到單元格3s點。 您將創建一個新的單元格,該單元格將到達位置4。現在,您有兩個具有相同indexPath鍵的控制器! 您如何避免這種情況? 現在已經搞砸了我的應用程序,因為已經移動的任務正在將它們的屬性加載到錯誤的視圖控制器/單元中!
有人建議我先解決此問題:“您維護一個“陰影”表內容的NSMutableArray。 還建議我使用標簽。 但是,我不知道如何實現這些。
編輯:---隨機字符串---在tasks.m中
-(NSString *)uniqueIdentifierString{
static NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString stringWithCapacity:20];
for (NSUInteger i = 0U; i < 20; i++) {
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
return s;
}
在tableviewcontroller.m中
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detailVC;
Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
if (![self.detailViewsDictionary.allKeys containsObject:task.uniqueIdentifierString]){
detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
[self.detailViewsDictionary setObject:detailVC forKey:task.uniqueIdentifierString];
detailVC.context = self.managedObjectContext;
}else{
detailVC = self.detailViewsDictionary[task.uniqueIdentifierString];
}
detailVC.testTask = task;
[[self navigationController] pushViewController:detailVC animated:YES];
NSLog(@"%@", detailVC);
NSLog(@"%@", task.uniqueIdentifierString);
}
一種解決方案是將VC與表單元分離。 您可以將VC存儲在由任務唯一的ID引用的字典中,而不必擔心表單元格。 如果任務被移動或刪除,則可以在其他地方處理該任務,而不必擔心VC陣列立即出錯。
您的另一個選擇是將移動VC數組的邏輯掛接到move / edit方法中,以在那時調整數組。
鑒於UITableView
希望重復使用單元格,您可以看到它並不是要成為其他數據的存儲機制。
最好將數據解耦,以使您不受數據順序或存在的約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.