webentwicklung-frage-antwort-db.com.de

Outlets können nicht mit wiederkehrenden Inhalten verbunden werden

Ich habe gerade eine App erstellt und habe angefangen, @ IBOutlet's mit dem Storyboard zu verbinden. Ich verbinde einige davon mit Etiketten in einer UITableViewCell-Prototypzelle mit einem Basisstil. Wenn ich es verbinde, erhalte ich diese Fehlermeldung im Storyboard:

Der detailText Outlet vom TableViewController zum UILabel ist ungültig. Ausgänge können nicht mit wiederkehrenden Inhalten verbunden werden.

Kann mir jemand helfen? Ich habe es so eingerichtet, wie ich es immer erfolgreich mache, aber diesmal hat es mir diesen Fehler geklaut.

129
Tomblasta

Erstellen Sie eine Tabellensicht-Zellunterklasse, und legen Sie sie als Klasse des Prototyps fest. Fügen Sie der Klasse die Auslässe hinzu und verbinden Sie sie. Wenn Sie nun die Zelle konfigurieren, können Sie auf die Ausgänge zugreifen.

155
Wain

Es gibt zwei Arten von Tabellensichtzellen, die Ihnen über das Storyboard bereitgestellt werden, nämlich Dynamic Prototypes und Static Cells.

 enter image description here

1. Dynamische Prototypen

Aus dem Namen wird dieser Zelltyp dynamisch generiert. Sie werden durch Ihren Code gesteuert, nicht durch das Storyboard. Mit Hilfe des Delegaten und der Datenquelle der Tabellensicht können Sie die Anzahl der Zellen, die Höhe der Zellen und den Prototyp der Zellen programmgesteuert angeben. 

Wenn Sie eine Zelle in Ihre Tabellenansicht ziehen, deklarieren Sie einen Prototyp von Zellen. Sie können dann eine beliebige Anzahl von Zellen auf der Basis dieses Prototyps erstellen und sie mithilfe der cellForRow-Methode programmgesteuert zur Tabellenansicht hinzufügen. Dies hat den Vorteil, dass Sie nur einen Prototyp definieren müssen, anstatt jede einzelne Zelle mit allen von Ihnen hinzugefügten Ansichten zu erstellen (siehe statische Zelle). 

In diesem Fall können Sie also keine Benutzeroberflächenelemente des Prototyps der Zelle an Ihren View-Controller anschließen. Sie haben nur ein View-Controller-Objekt initiiert, aber Sie haben möglicherweise viele Zellenobjekte initiiert und Ihrer Tabellensicht hinzugefügt. Es ist nicht sinnvoll, den Zellprototyp mit dem View-Controller zu verbinden, da Sie nicht mehrere Zellen mit einer View-Controller-Verbindung steuern können. Und Sie erhalten eine Fehlermeldung, wenn Sie dies tun.

 enter image description here

Um dieses Problem zu beheben, müssen Sie Ihr Prototyp-Label mit einem UITableViewCell-Objekt verbinden. Eine UITableViewCell ist auch ein Prototyp von Zellen, und Sie können beliebig viele Zellobjekte initiieren. Jedes von ihnen ist dann mit einer Ansicht verbunden, die aus Ihrem Prototyp der Storyboard-Tabellenzelle generiert wird.

 enter image description here

Erstellen Sie schließlich in Ihrer cellForRow-Methode die benutzerdefinierte Zelle aus der UITableViewCell-Klasse, und machen Sie Spaß mit der Beschriftung

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Statische Zellen

Auf der anderen Seite werden statische Zellen tatsächlich über das Storyboard konfiguriert. Sie müssen UI-Elemente in jede einzelne Zelle ziehen, um sie zu erstellen. Sie steuern die Zellennummern, -höhen usw. vom Storyboard aus. In diesem Fall sehen Sie eine Tabellenansicht, die auf Ihrem Telefon genau die gleiche ist, die Sie mit dem Storyboard erstellt haben. Statische Zellen werden häufiger zur Einstellung von Seiten verwendet, wobei sich die Zellen nicht viel ändern. 

Um UI-Elemente für eine statische Zelle zu steuern, müssen Sie sie tatsächlich direkt an Ihren View-Controller anschließen und einrichten.

 enter image description here

43
Fangming

Wenn Sie eine Tabellensicht verwenden, um Einstellungen und andere Optionen anzuzeigen (wie dies bei der integrierten Einstellungs-App der Fall ist), können Sie unter Inhalt der Tabellensicht auf Statische Zellen einstellen.der Attributinspektor. Dazu müssen Sie Ihre Table View in eine UITableViewController-Instanz einbetten.

20
Justin Domnitz

Oder Sie müssen nicht IBOutlet verwenden, um auf das Objekt in der Ansicht zu verweisen. Sie können das Label im tableViewCell a-Tag-Wert angeben, beispielsweise das Tag auf123setzen (dies kann durch den Attribut-Inspektor erfolgen). Dann können Sie auf das Label zugreifen 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}
4
SLN

Bei mir habe ich eine UIViewcontroller, und darin habe ich eine Tabellenansicht mit einer benutzerdefinierten Zelle. Ich ordne mein Outlet von UILabel in UItableviewcell der UIViewController zu und habe dann den Fehler erhalten.

1
lee

Da die meisten Leute darauf hingewiesen haben, dass subclassing UITableViewCell dieses Problem löst, ist dies jedoch nicht zulässig, da die Prototypzelle ( UITableViewCell ) von Apple definiert wird und Sie keine eigenen Outlets hinzufügen können dazu.

0
Nikhil Muskur