2016-09-02 5 views
0

Ich bin neu in Swift! Ich kann alle Künstler in der Tabellenansicht korrekt anzeigen. Aber ich kann nicht herausfinden, wie man eine Zeichenkette (Künstlername) in der Liste der unterteilten Künstler findet, die von einer Abfrage zurückgegeben wurden. Mein Code kann jeden Künstler im ersten Abschnitt, aber keinen anderen finden. Es scheint, dass mein rowNum nicht auf 0 zurückgesetzt wird, bevor ich mit der Suche im nächsten Abschnitt anfange (obwohl ich es versucht habe). Beispiel: Sektion 0 (der Buchstabe A) hat derzeit 12 Künstler (0 - 11). Wenn ich versuche, den 3. Künstler (The Beatles) in Abschnitt 1 (den Buchstaben B) zu finden, bekomme ich die richtige Abschnittsnummer von 1, aber die Zeilennummer von 14 (und rowNum sollte 2 für die Beatles sein).Suche nach Künstler (String) in Zeile im Abschnitt der Tabelle

var qryArtists = MPMediaQuery.artistsQuery() 
var rowNumInSectionWhereArtistWasFound = 0 
var sectionNumOfSectionWhereArtistWasFound = 0 

func findIndexAndSectionOfArtistInQuery(artist: String) { 
    var sectionNum = 0 
    var rowNum = 0 
    var found = false 
    // Search each section 
    while (sectionNum < qryArtists.itemSections?.count) && (found == false) { 
    // Search each row in the current section 
     while (rowNum < qryArtists.collectionSections![sectionNum].range.length) && (found == false) { 
      if qryArtists.collections![rowNum].items[0].artist == artist { 
       rowNumInSectionWhereArtistWasFound = rowNum 
       sectionNumOfSectionWhereArtistWasFound = sectionNum 
       found = true 
      } 
      rowNum = rowNum + 1 
     } 
     sectionNum = sectionNum + 1 
     rowNum = 0 // Reset the rowNum each time you start searching a new section 
    } 
} 

Vielen Dank für helping1!

+0

qryArtists.collectionSections! [SectionNum] .range.length) gibt nicht den richtigen Wert zurück, es sollte die Gesamtzahl der Künstler pro Abschnitt rit zurückgeben! Ändern Sie einfach, um die Gesamtzahl von ** Künstler pro Abschnitt zu erhalten ** wird Ihr Problem beheben –

+0

Vielen Dank, aber wie? Ich kann nicht herausfinden, was ich ändern soll. – James64

+0

Ich überprüfte. qryArtists.collectionSections! [sectionNum] .range.length gibt mir 12 Künstler in Sektion 0, gefolgt von 23 Künstlern in Sektion 1. Diese Werte sind korrekt. Ich brauche rowNum = 2. 14 wird was bestimmt (12 + 2 = 14). rowNum sollte bis zu 12 für Abschnitt 0 zählen und dann Ruhe auf 0 bekommen, so dass es dann bis zu 2 für Abschnitt 1 zählen kann. – James64

Antwort

0

Wenn Sie nach einer Funktion suchen, die Ihre Tabellenansicht durchsucht und NSIndexPath zurückgibt (das Objekt, das Zeile und Abschnitt einkapselt), durchsucht es Ihre Zellen und fragt nach jeder Zelle (von der ich annehme, dass sie eine Referenz enthält) seine Künstler-Eigenschaft), wenn sie einen passenden Namen haben:

func findIndexAndSectionOfArtistInQuery(artist: String) -> NSIndexPath { 
    for indexSection in 0...tableView.numberOfSections { 
     let numberOfRows = tableView.numberOfRowsInSection(indexSection) 
     for indexRow in 0...numberOfRows { 
      let indexPath: NSIndexPath = NSIndexPath(forRow: indexRow, inSection: indexSection) 
      let cell = tableView.cellForRowAtIndexPath(indexPath) as? CustomCell 
      if(cell!.artist.name == artist) { 
       return indexPath 
      } 
     } 
    } 
    return nil   
} 

Diese Funktion nil wenn ein Künstler zurückkehren kann nicht gefunden werden.

Ich rate Ihnen, Ihren Ansatz zu überdenken. Sie sollten Ihr Modell und nicht Ihre Tabellenansicht nach Daten abfragen. Darüber hinaus sollten Sie eine separate Klasse zum effizienten Durchsuchen Ihres Modells erstellen.

+0

Vielen Dank für den Versuch, mir zu helfen. Ich bin neu in iOS und Swift! Ich bin verwirrt. Ich denke, ich dachte, dass mein Code im Wesentlichen mit dem Ergebnis der Abfrage (Modell) und nicht mit meiner Tabellenansicht zu tun hat. Ich bin daran interessiert, Ihren Ansatz zu testen, aber Ihr Code bezieht sich auf TableView. Ist dein Code der richtige Weg? – James64

+0

Ich werde dein Modell nicht für dich entwerfen, aber im Allgemeinen verwendet iOS das MVC-Muster. Der Modellteil ist in der Regel dafür zuständig, die relevanten Daten Ihrer App zu speichern und CRUD-Vorgänge durchzuführen. Der Controller-Teil von MVC ist verantwortlich für das Reagieren auf Ereignisse, die im View-Element von MVC propagiert werden. In Ihrem Fall sollten Sie Ihre Tabellenansicht über Ihr Modell ausfüllen. Darüber hinaus könnte Ihr Modell auch für grundlegende Operationen verantwortlich sein (Suche, CRUD-Operationen). – BenJammin

+0

Ich habe versucht, Ihren Code, aber es erzeugt einen Fehler. Kann keine Nil zuweisen, wo ein NSIndexPath erwartet wird. Aber ich schätze deine Zeit und Mühe trotzdem. – James64

0

Das Einfügen des folgenden Codes anstelle des tatsächlichen "Tests" hat es behoben.

let currLoc = qryArtists.collectionSections![sectionNum].range.location 
let rowItem = qryArtists.collections![rowNum + currLoc] 
if rowItem.items[0].artist == artist { 
} 
Verwandte Themen