Le prese non possono essere collegate al contenuto ripetuto iOS


144

Ho appena creato un'app e ho iniziato a collegare @ IBOutlet's allo storyboard. Sto collegando alcuni di essi alle etichette in una cella prototipo UITableViewCell con uno stile di base. Quando lo collego anche se ottengo questo errore nello Storyboard:

L'output detailText da TableViewController a UILabel non è valido. Le prese non possono essere collegate al contenuto ripetuto.

Qualcuno mi può aiutare? L'ho impostato come faccio sempre con successo, ma questa volta mi ha eliminato questo errore.


54
Non è possibile connettere un'etichetta in una cella prototipo a un IBOutlet in una sottoclasse UIViewController - è necessario collegarlo a un IBOutlet in una sottoclasse UITableviewCell.
Paulw11,

Ok grazie! :) Quindi, solo per quello che capisco: puoi spiegare perché?
Tomblasta,

3
Perché è possibile avere un numero qualsiasi di celle e un solo controller di visualizzazione singola - quindi quale etichetta di cella deve essere collegata al controller di visualizzazione IBOutlet?
Paulw11,

Ok, quindi perché non potresti semplicemente usare cellForRowAtIndexPath per il testo della cella in un controller a vista singola? Grazie!
Tomblasta,

3
Perché le prese sono legate ad oggetti (come le etichette) quando viene caricato il controller di visualizzazione. A quel punto non ci sono celle, quindi nessuna etichetta da associare e se c'erano celle, quale si voleva legare
Paulw11

Risposte:


168

Creare una sottoclasse di celle della vista tabella e impostarla come classe del prototipo. Aggiungi le prese a quella classe e collegale. Ora, quando si configura la cella, è possibile accedere alle prese.


9
@Wain potresti aggiungere ulteriori informazioni sull'accesso a tali punti vendita?
Juan Boero,

1
Juan Pablo - Quello che sta dicendo è che è normale usare una cella di visualizzazione tabella personalizzata. Non è possibile impostare l'outlet per un vincolo all'interno della vista in cui si utilizza la cella, invece è necessario farlo in cellForRowAtIndexPath, ad esempio - customCell.constraint_row_width.constant = 25.0;
Stuart P.

70

Esistono due tipi di celle di visualizzazione tabella fornite attraverso lo storyboard, ovvero prototipi dinamici e celle statiche

inserisci qui la descrizione dell'immagine

1. Prototipi dinamici

Dal nome, questo tipo di cella viene generato in modo dinamico. Sono controllati dal tuo codice, non dallo storyboard. Con l'aiuto del delegato della vista tabella e dell'origine dati, è possibile specificare il numero di celle, altezze di celle, prototipo di celle a livello di programmazione.

Quando trascini una cella nella vista della tabella, dichiari un prototipo di celle. È quindi possibile creare qualsiasi quantità di celle di base su questo prototipo e aggiungerle alla vista tabella tramite il cellForRowmetodo, a livello di codice. Il vantaggio di questo è che devi solo definire 1 prototipo invece di creare ogni singola cella con tutte le viste aggiunte da te (vedi cella statica).

Pertanto, in questo caso, non è possibile connettere elementi dell'interfaccia utente sul prototipo di cella al controller della vista. Avrai solo un oggetto controller vista avviato, ma potresti avere molti oggetti cella avviati e aggiunti alla vista tabella. Non ha senso collegare il prototipo di cella per visualizzare il controller perché non è possibile controllare più celle con una connessione del controller di visualizzazione. E otterrai un errore se lo fai.

inserisci qui la descrizione dell'immagine

Per risolvere questo problema, è necessario collegare l'etichetta del prototipo a un UITableViewCelloggetto. A UITableViewCellè anche un prototipo di celle e puoi avviare tutti gli oggetti cella che desideri, ognuno di essi viene quindi collegato a una vista generata dal prototipo delle celle della tabella dello storyboard.

inserisci qui la descrizione dell'immagine

Infine, nel tuo cellForRowmetodo, crea la cella personalizzata dalla UITableViewCellclasse e fai cose divertenti con l'etichetta

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. Celle statiche

D'altra parte, le celle statiche sono effettivamente configurate tramite storyboard. Devi trascinare gli elementi dell'interfaccia utente in ogni cella per crearli. Controllerai i numeri di cella, le altezze, ecc. Dallo storyboard. In questo caso, vedrai una vista tabella esattamente identica dal tuo telefono rispetto a quella creata dallo storyboard. Le celle statiche sono più spesso utilizzate per l'impostazione della pagina, che non cambia molto.

Per controllare gli elementi dell'interfaccia utente per una cella statica, dovrai effettivamente collegarli direttamente al controller di visualizzazione e configurarli.

inserisci qui la descrizione dell'immagine


@FangmingNing nel mio codice, non riesco ancora a cambiare l'etichetta di testo, ho collegato la classe alla cella, chiamata cella corretta con identificatore, ma ancora non cambiando
jorge saraiva

@jorgesaraiva Ne parliamo nella chat room chat.stackoverflow.com/rooms/159396/discuss
Fangming

Mi mancava ! YourCell . +100
Daniel Springer

Sempre bene avere un po 'di aggiornamento dopo aver lavorato su un progetto nel solo codice per 6 mesi.
ttorbik,

Grazie, il mio problema è che lo sto collegando al ViewController piuttosto che alla cella.
Stella,

23

Se stai usando una vista tabella per impostazioni di visualizzazione e altre opzioni (come l'applicazione integrata delle impostazioni fa), allora è possibile impostare il Table View Content per celle statiche sotto gli attributi ispettore . Inoltre, per fare ciò, è necessario incorporare la vista tabella in un'istanza UITableViewController.


Questo è molto più semplice e veloce e dovrebbe essere la risposta accettata imho
Jaime Agudo

5

Oppure non è necessario utilizzare IBOutlet per fare riferimento all'oggetto nella vista. È possibile assegnare all'etichetta in tableViewCell un valore di Tag, ad esempio impostare il Tag su 123 (ciò può essere fatto dall'ispettore degli attributi). Quindi è possibile accedere all'etichetta da

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 
}

molto facile e semplice! +100
Julian Silvestri,

1

Con me ho un UIViewcontroller, e in esso ho una tabella con una cella personalizzata su di esso. Ho mappato il mio outlet di UILabel UItableviewcellper UIViewControllerpoi ottenere l'errore.


crea una classe cellulare personalizzata e crea un'istanza nella tua classe personalizzata
Shauket Sheikh

0

Come molte persone hanno sottolineato che la sottoclasse UITableViewCell risolve questo problema. Ma il motivo non è consentito perché la cella prototipo ( UITableViewCell ) è definita da Apple e non è possibile aggiungere alcuno dei propri punti vendita.


0

A volte Xcode non è in grado di controllare correttamente la connessione di uscita della cella.

In qualche modo l'etichetta / il pulsante della mia cella attuale ha collegato un'altra cella, li rimuovo e l'errore scompare.


-1

Fai clic sul simulatore, vai alla finestra e abilita le cornici dei dispositivi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.