2015-03-26 8 views
43

Sono abbastanza nuovo per la codifica in generale e davvero nuovo per Xcode (Swift). Capisco che ho bisogno di registrare un pennino o una classe, ma non capisco 'dove o come?'.impossibile disconnettere una cella con identificatore Cell - deve registrare un pennino o una classe per l'identificatore o collegare una cella prototipo in uno storyboard

import UIKit 

class NotesListViewController: UITableViewController { 

    @IBOutlet weak var menuButton: UIBarButtonItem! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "preferredContentSizeChanged:", 
     name: UIContentSizeCategoryDidChangeNotification, 
     object: nil) 

    // Side Menu 

    if self.revealViewController() != nil { 
     menuButton.target = self.revealViewController() 
     menuButton.action = "revealToggle:" 
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
    } 

    } 

    override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    // whenever this view controller appears, reload the table. This allows it to reflect any changes 
    // made whilst editing notes 
    tableView.reloadData() 
    } 

    func preferredContentSizeChanged(notification: NSNotification) { 
    tableView.reloadData() 
    } 

    // #pragma mark - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return notes.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

    let note = notes[indexPath.row] 
    let font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) 
    let textColor = UIColor(red: 0.175, green: 0.458, blue: 0.831, alpha: 1) 
    let attributes = [ 
     NSForegroundColorAttributeName : textColor, 
     NSFontAttributeName : font, 
     NSTextEffectAttributeName : NSTextEffectLetterpressStyle 
    ] 
    let attributedString = NSAttributedString(string: note.title, attributes: attributes) 

    cell.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) 

    cell.textLabel?.attributedText = attributedString 

    return cell 
    } 

    let label: UILabel = { 
    let temporaryLabel = UILabel(frame: CGRect(x: 0, y: 0, width: Int.max, height: Int.max)) 
    temporaryLabel.text = "test" 
    return temporaryLabel 
    }() 

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline) 
    label.sizeToFit() 
    return label.frame.height * 1.7 
    } 

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 
     notes.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
    } 
    } 

    // #pragma mark - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if let editorVC = segue.destinationViewController as? NoteEditorViewController { 

     if "CellSelected" == segue.identifier { 
     if let path = tableView.indexPathForSelectedRow() { 
      editorVC.note = notes[path.row] 
     } 
     } else if "AddNewNote" == segue.identifier { 
     let note = Note(text: " ") 
     editorVC.note = note 
     notes.append(note) 
     } 
    } 
    } 

} 
+0

** Attenzione per la confusione "ID Restauro" - che non è altro ** fate clic sulla quarta ** ** scheda in alto a destra, NON la scheda TERZO !! – Fattie

risposta

36

Avete impostare il cella tabella identificativo per "Cell" nel vostro storyboard?

Oppure hai impostato la classe per il UITableViewController per la tua classe in quella scena?

+0

come risolvere ?? Si prega di spiegare in dettaglio? – JUL2791

5

Basta trascinare una cella (come hai fatto per TableViewController) e aggiungerla semplicemente rilasciando la cella su TableViewController. Fare clic sulla cella e.Vai al suo ispettore attributi e impostare il suo identificatore come "Cell". Spero che funzioni.


Non dimenticate che si desidera Identifier sul Attributi ispettore.

(NON il "ID Restauro" sulla "ispettore identità"!)

+3

Attenzione per il confondente "ID di ripristino" - che non è niente! Fare clic sulla scheda QUARTO in alto a destra, NON la scheda TERZO !!! – Fattie

16

ho avuto questo problema oggi che è stato risolto selezionando prodotto -> Clean. Ero così confuso da quando il mio codice era corretto. Il problema è iniziato da utilizzando il comando-Z troppe volte :)

+0

Seriamente passato più di un'ora cercando di eseguire il debug di questo. Grazie :) – ewakened

+0

Ovviamente funziona in combinazione con la definizione dell'identificatore nello storyboard (vedi la risposta successiva) – Nech

56

È possibile registrare una classe per il UITableViewCell come questo:

Con Swift 3+:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 

Con Swift 2.2 :

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

assicurarsi stesso identificatore "cell "viene anche copiato nello UITableViewCell dello storyboard.

"self" è per ottenere che la classe usi il nome della classe seguito da .self.

+1

Dove lo metti? – RJB

+4

in 'viewDidLoad()' – Mette

+4

Se si utilizza uno xib nella cella personalizzata, sarà necessario registrarlo in questo modo: 'tableView.register (UINib.init (nibName:" CustomCell ", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier") ' – atulkhatri

2

In Swift 3.0, registrare una classe per il vostro UITableViewCell come questo:

tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell") 
8

y mio caso ho risolto questo nome nella "Identifier" proprietà di Table View Cell:

enter image description here

non dimenticate: dichiarare nella tua classe: UITableViewDataSource

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell 
+0

questa immagine non corrisponde, ma ha dato qualche suggerimento. – Martian2049

+0

è un po 'antiquato – Martian2049

1

Ho appena incontrato lo stesso problema e vedo questo post. Per me è perché ho dimenticato il set dell'identificatore della cella, anche come menzionato in altre risposte. Quello che voglio dire è che se si sta usando lo storyboard per caricare celle personalizzate, non è necessario registrare la cella di visualizzazione tabella nel codice, il che può causare altri problemi.

Vedi questo post per ingrandire:

Custom table view cell: IBOutlet label is nil

2

Questo ha funzionato per me, può aiutare anche voi:

Swift 3:

self.tableView.register(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell") 

Swift 2.2:

self.tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell") 

dobbiamo impostare Identifier proprietà alla visualizzazione tabulare cellulare come menzione nel seguito,

enter image description here

Si prega di modificare l'immagine di cui sopra. La proprietà dell'identificatore è sulla quarta scheda NON terza. come menzionato da Fattie in un'altra risposta - "Attenzione per il confondente" ID di ripristino "- che non è niente! Fai clic sulla QUARTA scheda in alto a destra, NON la scheda TERZO !!! - Fattie 17 marzo alle 14:59 "

0

Un altro motivo per cui questo problema si verifica è un problema precedente. Quando si mostra un nuovo ViewController, l'istanziazione del ViewController di destinazione direttamente non carica le celle del prototipo dallo StoryBoard. La soluzione corretta dovrebbe essere sempre per istanziare il controller della vista attraverso la scheda di storia come questa:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")