我有一个从 JSON 文件创建的tableview
,该文件跟踪单元格的已检查/未选中状态。唯一的问题是,当我实现SearchResults
视图时,我的结果是倾斜的,因为我检查索引路径上的单元格,并更新相应的 JSON 条目 ( SubscribeStatus
)。
var cell = tableView.CellAt(indexPath);
想知道是否有另一种方法可以修改,或者找出另一种方法,以考虑所显示搜索结果的正确索引。 下面是一些示例代码:
public override void RowSelected(UITableView tableView,NSIndexPath indexPath)
{
var cell = tableView.CellAt(indexPath);
var value = this.tableviewController.TableView==search.SearchResultsTableView ? filteredDataList[indexPath.Row] : dataList[indexPath.Row];
if (value.Selected)
{
value.Selected = false;
var uncheckedImage = new UIImageView (UIImage.FromBundle("unchecked"));
cell.AccessoryView = uncheckedImage;
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var localPath = Path.Combine (documentsPath, "marketnibble_sample_customers.json");
string json = File.ReadAllText (localPath);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject (json);
jsonObj ["Business"] [indexPath.Row] ["SubscribeStatus"] = false;
string output = Newtonsoft.Json.JsonConvert.SerializeObject (jsonObj);
File.WriteAllText (localPath, output);
}
else
{
value.Selected = true;
var checkedImage = new UIImageView (UIImage.FromBundle("checked"));
cell.AccessoryView = checkedImage;
string documentsPath1 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var localPath1 = Path.Combine(documentsPath1, "marketnibble_sample_customers.json");
string json = File.ReadAllText(localPath1);
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject (json);
jsonObj["Business"][indexPath.Row]["SubscribeStatus"] = true;
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj);
File.WriteAllText (localPath1, output);
}
cell.Selected = false;
tableviewController.TableView.ReloadData ();
}
我听说过一种用cell.Tag()
做到这一点的方法,但不知道从哪里开始。解决这个问题的最佳方法是什么?
您需要一种 indexPath 以外的方法来将单元格映射到其基础数据。 可以使用 Tag 属性执行此操作 - Tag 只是一个字符串,可用于任何你喜欢的字符串。 最简单的方法是将 JSON 元素的 ID 或 Key 属性存储在标记中,然后每当选择单元格时,都可以使用 Tag proprerty 查找 JSON 中的基础数据并对其进行适当更新。
目前,您正在将数据存储在文件中。您可以为持久存储执行此操作。但这不是我建议的好方法,如果你将使用coredata,它会更有帮助。
您必须创建一个实体来存储您的选择状态。
还有一件事,无需在选择行上重新加载表,只需仅更新该选择行即可。