2017-01-15 5 views
4

Ich konnte buchstäblich kein einziges Tutorial finden, das mir zeigte, wie man eine App baut, die statische Zellen verwendet; mit anklickbaren Zellen. Basierend auf einigen wenigen veralteten Antworten und object-c Antworten, habe ich etwas zusammengestellt. Mein Problem ist, wenn ich auf eine Zelle klicke, bekomme ich staticDemoTableCell hat kein Mitglied present.Wie man eine statische Zelle mit Swift richtig implementiert

Ich habe einen Tabellen-Controller in meinem UIViewController eingebettet. Für diese Zelle (nur eine bisher), habe ich eine Klasse erstellt:

class staticDemoTableCell: UITableViewCell, UITableViewDelegate { 
    @IBOutlet weak var tableView: UITableView! 

    override func awakeFromNib() { 
    [...] 
    tableView.delegate = self 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print("clicked") // Works when the cell is clicked 
    // self.present() do not work. I need to present another viewcontroller when this cell is clicked 
    } 

} 

Etwas nicht richtig sitzen, für jede Zelle ist eine Klasse?

Ich muss wirklich wissen, ob ich den richtigen Weg über das getan habe. Was ich wirklich will, ist mehr zu so etwas. Haben Sie gesehen, zB: gruppierte Transaktionen Montag: eine Liste, Dienstag: eine Liste usw. Jede Zelle ist anklickbar wie die Einstellungen Ihres iOS-Gerätes. Alle Hinweise sind sehr dankbar.

+0

Die Zelle ist im Allgemeinen nicht das 'UITableViewDelegate' (weil Sie mehrere Zellen haben, aber die Tabellenansicht nur einen Delegaten haben kann). Im Allgemeinen wäre der View-Controller (und nur dann, wenn Sie den "Delegate" der Tabellenansicht entsprechend setzen). – Rob

+0

@Rob Danke dafür. – Sylar

+0

"Etwas stimmt nicht, denn jede Zelle ist eine Klasse?" Wenn es aus der Antwort unten (und meinem Kommentar oben) nicht klar ist, nein, Sie brauchen (und wollen wahrscheinlich auch nicht) verschiedene Klassen für die Zellen. In der Tat benötigen Sie überhaupt keine Unterklasse "UITableViewCell". Es ist sehr leistungsfähig für dynamische Zellen, aber für statische Tabellen ist es völlig unnötig. – Rob

Antwort

8

Es ist viel einfacher, wenn die Tabellenansicht nur statische Zellen enthält:

  • In Interface Builder die Tabellenansicht auswählen und die Content zu Static Cells
  • erstellen IBOutlet s und IBAction s in der Controller-Klasse und verbinde sie.
  • Das Implementieren von Datenquellenmethoden und Unterklassen von Tabellenansichten ist nicht erforderlich.
+0

Hallo. Ja ich habe auf statisch und gruppiert gesetzt. 'IBOutlets' sind verbunden, aber ich habe keine' IBAction'; keine Knöpfe. Eine Zelle sollte klickbar sein, die mich zum x-Controller führt. Wie? – Sylar

+0

Ich habe es nie selbst ausprobiert aber funktioniert der Delegat 'didSelect ...' (implementiert im Controller) nicht? – vadian

+0

Ja, das funktioniert. Ich habe den Druck bekommen. Ziel ist es, zu einem anderen View-Controller zu navigieren. 'self.present' funktionieren nicht. Ich nehme an, 'present' funktioniert nur in einem uiviewcontroller? Ich weiß, dass hier etwas nicht stimmt. – Sylar

5

So können Sie Folgendes tun. Legen Sie die Tabellenansicht fest und machen Sie die Zellen statisch. Sobald Sie dies getan haben, müssen Sie sicherstellen, dass Sie wissen, wie viele Bereiche Sie haben werden. Dies hängt von Ihrem Design ab oder davon, was Sie erreichen möchten.

Dann können Sie etwas tun:

Wenn Sie mehr als einen Abschnitt haben, und Abschnitt 1 hat mehr als eine Zelle. Und Abschnitt 2 hat nur eine Zelle.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    switch indexPath.section { 
    case 1: 
     switch indexPath.row { 
     case 0: 
      // Do something 
     case 1: 
      // Do something 
     default: 
      break 
     } 
    case 2: 
     // Do something 
    default: 
     break 
    } 
} 

Wenn Sie nur einen Abschnitt mit zwei Zellen haben Sie so etwas wie tun:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    switch indexPath.row { 
    case 0: 
     // Do something 
    case 1: 
     // Do something 
    default: 
     break 
    } 
} 

Ich hoffe, das Ihr Problem zu lösen hilft. Viel Glück

Verwandte Themen