criando células tableview personalizadas em swift

Eu tenho uma class de célula personalizada com um par de IBOutlets. Eu adicionei a class ao storyboard. Eu conectei todas as minhas saídas. minha function cellForRowAtIndexPath tem esta aparência:

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 } 

Aqui está minha class de célula personalizada:

 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 eu executo o aplicativo, todas as minhas células estão vazias. Eu fiz o logout self.venueService.mainCategoriesArray() e ele contém todas as strings corretas. Eu também tentei colocar uma string real igual ao label, e isso produz o mesmo resultado.

o que estou perdendo? Qualquer ajuda é apreciada.

Exemplo de célula de exibição de tabela personalizada

Testado com o Xcode 9 e o Swift 4

O consulente da questão original resolveu seu problema. Estou adicionando essa resposta como um mini projeto de exemplo independente para outras pessoas que estão tentando fazer a mesma coisa.

O projeto finalizado deve ficar assim:

insira a descrição da imagem aqui

Crie um novo projeto

Pode ser apenas um aplicativo de visualização única.

Adicione o código

Adicione um novo arquivo Swift ao seu projeto. Nomeie-o como MyCustomCell.swift. Essa turma armazenará os pontos de vista das visualizações adicionadas à sua célula no storyboard.

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

Nós conectaremos estas tomadas mais tarde.

Abra ViewController.swift e verifique se você tem o seguinte conteúdo:

 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).") } } 

Configurar o storyboard

Adicione uma visualização de tabela ao seu controlador de visualização e use o layout automático para fixá-la nos quatro lados do controlador de exibição. Em seguida, arraste uma célula de exibição de tabela para a exibição de tabela. Em seguida, arraste um View e um Label para a célula Prototype. (Talvez seja necessário selecionar a célula de exibição de tabela e definir manualmente a altura da linha como algo mais alto no inspetor de tamanho, para que você tenha mais espaço para trabalhar.) Use layout automático para corrigir a exibição e o label como você deseja que eles sejam organizados a exibição de conteúdo da célula de exibição de tabela. Por exemplo, eu fiz minha visualização ser 100×100.

insira a descrição da imagem aqui

Outras configurações do IB

Nome da class personalizada e identificador

Selecione a célula de exibição de tabela e defina a class personalizada como MyCustomCell (o nome da class no arquivo Swift que adicionamos). Também defina o identificador para ser cell (a mesma string que usamos para o cellReuseIdentifier no código acima.

insira a descrição da imagem aqui

Ligue as saídas

  • Controle o arraste do Table View no storyboard para a variável tableView no código ViewController .
  • Faça o mesmo para o View e o Label em sua célula Prototype para as variables myCellLabel e myCellLabel na class MyCustomCell .

Acabado

É isso aí. Você deve ser capaz de executar seu projeto agora.

Notas

  • As vistas coloridas que eu usei aqui poderiam ser substituídas por qualquer coisa. Um exemplo óbvio seria um UIImageView .
  • Se você está apenas tentando fazer com que um TableView funcione, veja este exemplo ainda mais básico .
  • Se você precisar de uma exibição de tabela com alturas de células variables, consulte este exemplo .

Isto é para quem está trabalhando célula personalizada com.

 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} 

Eu tenho o mesmo problema.

Geralmente o que eu fiz é o mesmo com você.

 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 no método 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 sim a tableview não mostra nada! Mas adivinhe o que realmente mostra alguma coisa … porque o log que recebo do println (cell.testLabel) mostra que todos os labels são exibidos.

MAS! seus frameworks é estranho, que tem algo parecido com isto:

trama = (0 a 21; 42 21);

então tem um (0, -21) como (x, y), então isso significa que o label é exibido em algum lugar fora do limite da célula.

então eu tento adicionar ajustar o quadro manualmente assim:

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

e infelizmente, não funciona.

————— atualização após 10 min —————–

EU FIZ ISSO. então, parece que o problema vem das classs de tamanho.

Clique no seu arquivo .storyboard e vá para a aba File Inspector

Caixa de seleção UNCHECK THE Size Classes

e finalmente meu label “tão triste” sai!

Obrigado por todas as diferentes sugestões, mas finalmente descobri. A class personalizada foi configurada corretamente. Tudo o que eu precisava fazer era no storyboard escolher a class personalizada: removê-la e selecioná-la novamente. Não faz muito sentido, mas acabou por trabalhar para mim.

Última versão atualizada é com o 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) } } 

Desmarque a checkbox de seleção “Classes de tamanho” para mim também, mas você também pode adicionar as restrições ausentes no construtor de interface. Basta usar a function incorporada se você não quiser adicionar as restrições por conta própria. Usar restrições é – na minha opinião – a melhor maneira, porque o layout é independente do dispositivo (iPhone ou iPad).

É notação puramente rápida trabalhando para mim

 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] Primeiro, projete sua célula tableview no StoryBoard.

[2] Coloque o método delegado de exibição de tabela abaixo

// MARK: – Métodos de Delegação de 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: – Métodos personalizados

 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 } 

Definir tag para imageview e rotular na célula

 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 } 

OU

 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 } 

veja também o carregador TableImage do github

A documentação de referência real da Apple é bastante abrangente

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

Role para baixo até ver esta parte

insira a descrição da imagem aqui