0

Ich habe eine tableview, die ich aus einer JSON-Datei erstellt habe, die den aktivierten/deaktivierten Status der Zelle verfolgt. Das einzige Problem ist, dass, wenn ich eine SearchResults Ansicht implementiert habe, meine Ergebnisse verzerrt sind, weil ich die Zelle im Indexpfad überprüfe, und ich den entsprechenden JSON-Eintrag (SubscribeStatus) aktualisiere.TableView RowSelected mit SearchResultsTableView: Verfolgen des Zellenindex für CheckMark

var cell = tableView.CellAt(indexPath); 

fragen sich, ob es eine andere Möglichkeit ist zu ändern oder einen anderen Ansatz, herauszufinden, die den korrekten Index für die Suchergebnisse angezeigt berücksichtigt. Hier ist ein Beispielcode unter:

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(); 
    } 

Ich habe von einer Art und Weise zu hören, dies zu tun mit cell.Tag(), habe aber keine Ahnung, wo man anfangen soll. Was wäre der beste Weg, um dies zu erreichen?

Antwort

1

Sie benötigen einen anderen Weg als indexPath, um eine Zelle ihren zugrunde liegenden Daten zuzuordnen. Sie können dafür die Tag-Eigenschaft verwenden - Tag ist nur eine Zeichenfolge, die Sie für beliebige Zeichen verwenden können. Am einfachsten wäre es, die ID- oder Schlüsseleigenschaft Ihres JSON-Elements im Tag zu speichern. Wenn eine Zelle ausgewählt ist, können Sie mithilfe des Tags proprerty die zugrunde liegenden Daten im JSON finden und entsprechend aktualisieren.

+0

Danke. Das ist der Weg! – pkozlowski

0

Momentan speichern Sie Ihre Daten in einer Datei. Sie können dies für den persistenten Speicher tun. Aber das ist kein guter Weg, den ich vorgeschlagen habe, wenn Sie coredata verwenden, als es hilfreicher ist.

Sie müssen eine Entität erstellen, die auch Ihren Auswahlstatus speichert.

Und noch eine Sache, es gibt keine Notwendigkeit, Tabelle in ausgewählter Zeile neu zu laden, nur diese Zeile zu aktualisieren.

+0

Vielen Dank, ich denke, die Tag-Eigenschaft ist der Weg zu gehen. – pkozlowski