creare celle tableview personalizzate in modo rapido

Ho una class di celle personalizzata con un paio di IBOutlet. Ho aggiunto la lezione allo storyboard. Ho collegato tutti i miei punti vendita. la mia funzione cellForRowAtIndexPath si presenta così:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as SwipeableCell cell.mainTextLabel.text = self.venueService.mainCategoriesArray()[indexPath.row] return cell } 

Ecco la mia class di celle personalizzate:

 class SwipeableCell: UITableViewCell { @IBOutlet var option1: UIButton @IBOutlet var option2: UIButton @IBOutlet var topLayerView : UIView @IBOutlet var mainTextLabel : UILabel @IBOutlet var categoryIcon : UIImageView init(style: UITableViewCellStyle, reuseIdentifier: String!) { super.init(style: style, reuseIdentifier: reuseIdentifier) } } 

Quando eseguo l’app, tutte le mie celle sono vuote. Ho disconnesso self.venueService.mainCategoriesArray() e contiene tutte le stringhe corrette. Ho anche provato a mettere una stringa reale uguale all’etichetta, e questo produce lo stesso risultato.

Cosa mi manca? Qualsiasi aiuto è apprezzato.

Esempio di cella di visualizzazione tabella personalizzata

Testato con Xcode 9 e Swift 4

Il richiedente della domanda originale ha risolto il loro problema. Sto aggiungendo questa risposta come un mini esempio di progetto autonomo per gli altri che stanno cercando di fare la stessa cosa.

Il progetto finito dovrebbe assomigliare a questo:

inserisci la descrizione dell'immagine qui

Crea un nuovo progetto

Può essere solo un’applicazione vista singola.

Aggiungi il codice

Aggiungi un nuovo file Swift al tuo progetto. Denominalo MyCustomCell.swift. Questa class terrà gli outlets per le viste che aggiungi alla tua cella nello storyboard.

 import UIKit class MyCustomCell: UITableViewCell { @IBOutlet weak var myView: UIView! @IBOutlet weak var myCellLabel: UILabel! } 

In futuro collegheremo questi punti vendita.

Apri ViewController.swift e assicurati di avere il seguente contenuto:

 import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // These strings will be the data for the table view cells let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"] // These are the colors of the square views in our table view cells. // In a real project you might use UIImages. let colors = [UIColor.blue, UIColor.yellow, UIColor.magenta, UIColor.red, UIColor.brown] // Don't forget to enter this in IB also let cellReuseIdentifier = "cell" @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } // number of rows in table view func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.animals.count } // create a cell for each table view row func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell cell.myView.backgroundColor = self.colors[indexPath.row] cell.myCellLabel.text = self.animals[indexPath.row] return cell } // method to run when table view cell is tapped func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("You tapped cell number \(indexPath.row).") } } 

Imposta lo storyboard

Aggiungi una vista tabella al controller di visualizzazione e utilizza il layout automatico per collegarlo ai quattro lati del controller di visualizzazione. Quindi trascinare una cella di visualizzazione tabella nella vista tabella. E quindi trascinare una vista e un’etichetta sulla cella del prototipo. (Potrebbe essere necessario selezionare la cella Visualizza tabella e impostare manualmente Altezza riga su qualcosa di più alto in Impostazioni dimensioni in modo da avere più spazio per lavorare.) Usa layout automatico per correggere la vista e l’etichetta come vuoi che siano disposte all’interno la vista del contenuto della cella Visualizza tabella. Ad esempio, ho reso la mia vista 100×100.

inserisci la descrizione dell'immagine qui

Altre impostazioni IB

Nome class e identificatore personalizzati

Seleziona la cella Visualizza tabella e imposta la class personalizzata come MyCustomCell (il nome della class nel file Swift che abbiamo aggiunto). Imposta anche l’identificatore come cell (la stessa stringa che abbiamo usato per cellReuseIdentifier nel codice sopra.

inserisci la descrizione dell'immagine qui

Agganciare le prese

  • Controlla il trascinamento dalla visualizzazione tabella nello storyboard alla variabile tableView nel codice ViewController .
  • Fai lo stesso per la vista e l’etichetta nella tua cella Prototype alle variabili myView e myCellLabel nella class MyCustomCell .

Finito

Questo è tutto. Dovresti essere in grado di eseguire il tuo progetto ora.

Gli appunti

  • Le viste colorate che ho usato qui potrebbero essere sostituite con qualsiasi cosa. Un ovvio esempio sarebbe un UIImageView .
  • Se stai solo cercando di far funzionare un TableView, vedi questo esempio ancora più semplice .
  • Se hai bisogno di una vista tabella con altezze di celle variabili, consulta questo esempio .

Questo è per chi sta lavorando con cella personalizzata con .xib

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let identifier = "Custom" var cell: CustomCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomCel if cell == nil { tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: identifier) cell =tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomCell }return cell} 

Ho lo stesso problema.

Generalmente quello che ho fatto è lo stesso con te.

 class dynamicCell: UITableViewCell { @IBOutlet var testLabel : UILabel init(style: UITableViewCellStyle, reuseIdentifier: String) { super.init(style: style, reuseIdentifier: reuseIdentifier) } override func awakeFromNib() { super.awakeFromNib() } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } } 

e nel metodo uitableviewcell:

 func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { var cell :dynamicCell = tableView.dequeueReusableCellWithIdentifier("cell") as dynamicCell cell.testLabel.text = "so sad" println(cell.testLabel) return cell; } 

e sì la tabella non mostra nulla! Ma indovina cosa mostra effettivamente qualcosa … perché il log che ricevo da println (cell.testLabel) mostra che tutte le etichette sono effettivamente visualizzate.

MA! i loro Frames sono strani, che hanno qualcosa del genere:

frame = (0 -21; 42 21);

quindi ha un (0, -21) come (x, y), quindi questo significa che l’etichetta è appena apparsa da qualche parte al di fuori del limite della cella.

quindi provo ad aggiungere regolare la cornice manualmente in questo modo:

cell.testLabel.frame = CGRectMake (10, 10, 42, 21)

e purtroppo, non funziona.

————— aggiornamento dopo 10 minuti —————–

L’HO FATTO. quindi, sembra che il problema derivi dalle classi di dimensioni.

Fai clic sul file .storyboard e vai alla scheda File Inspector

Deseleziona la casella di controllo Classi di dimensioni

e finalmente la mia etichetta “così triste” viene fuori!

Grazie per tutti i diversi suggerimenti, ma alla fine l’ho capito. La class personalizzata è stata impostata correttamente. Tutto quello che dovevo fare era nello storyboard in cui sceglievo la class personalizzata: rimuovila e selezionala di nuovo. Non ha molto senso, ma alla fine ha funzionato per me.

L’ultima versione aggiornata è con xCode 6.1

 class StampInfoTableViewCell: UITableViewCell{ @IBOutlet weak var stampDate: UILabel! @IBOutlet weak var numberText: UILabel! override init?(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init(coder aDecoder: NSCoder) { //fatalError("init(coder:) has not been implemented") super.init(coder: aDecoder) } override func awakeFromNib() { super.awakeFromNib() } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } } 

Deseleziona la casella di controllo “Classi di dimensioni” anche per me, ma potresti anche aggiungere i vincoli mancanti nel generatore di interfacce. Usa la funzione built-in solo se non vuoi aggiungere i vincoli da solo. Usare i vincoli è – secondo me – il modo migliore perché il layout è indipendente dal dispositivo (iPhone o iPad).

È una notazione puramente rapida che funziona per me

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cellIdentifier:String = "CustomFields" var cell:CustomCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CustomCell if (cell == nil) { var nib:Array = NSBundle.mainBundle().loadNibNamed("CustomCell", owner: self, options: nil) cell = nib[0] as? CustomCell } return cell! } 

[1] In primo luogo Progetta la tua cella tableview in StoryBoard.

[2] Metti sotto il metodo delegate view table

// MARK: – Metodi di delega Tableview

 func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return <“Your Array”> } func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { var totalHeight : CGFloat = . 

// MARK: – Metodi personalizzati

 func UpdateRowHeight ( ViewToAdd : UILabel , textToAdd : AnyObject ) -> CGFloat{ var actualHeight : CGFloat = ViewToAdd.frame.size.height if let strName : String? = (textToAdd as? String) where !strName!.isEmpty { actualHeight = heightForView1(strName!, font: ViewToAdd.font, width: ViewToAdd.frame.size.width, DesignTimeHeight: actualHeight ) } return actualHeight } 

Imposta il tag per imageview ed etichetta nella cella

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.tableData.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("imagedataCell", forIndexPath: indexPath) as! UITableViewCell let rowData = self.tableData[indexPath.row] as! NSDictionary let urlString = rowData["artworkUrl60"] as? String // Create an NSURL instance from the String URL we get from the API let imgURL = NSURL(string: urlString!) // Get the formatted price string for display in the subtitle let formattedPrice = rowData["formattedPrice"] as? String // Download an NSData representation of the image at the URL let imgData = NSData(contentsOfURL: imgURL!) (cell.contentView.viewWithTag(1) as! UIImageView).image = UIImage(data: imgData!) (cell.contentView.viewWithTag(2) as! UILabel).text = rowData["trackName"] as? String return cell } 

O

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "imagedataCell") if let rowData: NSDictionary = self.tableData[indexPath.row] as? NSDictionary, urlString = rowData["artworkUrl60"] as? String, imgURL = NSURL(string: urlString), formattedPrice = rowData["formattedPrice"] as? String, imgData = NSData(contentsOfURL: imgURL), trackName = rowData["trackName"] as? String { cell.detailTextLabel?.text = formattedPrice cell.imageView?.image = UIImage(data: imgData) cell.textLabel?.text = trackName } return cell } 

vedi anche TableImage loader da github

L’effettiva documentazione di riferimento Apple è abbastanza completa

https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson7.html

Scorri verso il basso finché non vedi questa parte

inserisci la descrizione dell'immagine qui