Estou tentando criar uma célula de exibição de tabela personalizada a partir de uma ponta. Estou me referindo a este artigo aqui . Estou enfrentando dois problemas.
Criei um arquivo .xib com um objeto UITableViewCell arrastado para ele. Criei uma subclasse UITableViewCell
e a defini como classe da célula e Cell como identificador reutilizável.
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
No UITableViewController eu tenho esse código,
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
Este código está em conformidade com nenhum erro, mas quando o executo no simulador, ele se parece com isso.
No UITableViewController no storyboard, não fiz nada na célula. Identificador em branco e nenhuma subclasse. Eu tentei adicionar o celular identificador de à célula protótipo e executei-o novamente, mas obtive o mesmo resultado.
Outro erro que enfrentei foi quando tentei implementar o seguinte método no UITableViewController.
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
Conforme mostrado no artigo que mencionei, alterei o cell
formulário do tipo de parâmetro UITableViewCell
para o CustomOneCell
qual é minha subclasse de UITableViewCell. Mas eu recebo o seguinte erro,
Substituindo método com o seletor 'tableView: willDisplayCell: forRowAtIndexPath:' possui tipo incompatível '(UITableView !, CustomOneCell !, NSIndexPath!) -> ()'
Alguém tem alguma idéia de como resolver esses erros? Eles pareciam funcionar bem no Objective-C.
Obrigado.
EDIT: Acabei de notar que, se eu mudar a orientação do simulador para paisagem e voltar ao retrato, as células aparecerão! Eu ainda não conseguia descobrir o que estava acontecendo. Fiz upload de um projeto Xcode aqui demonstrando o problema se você tiver tempo para uma rápida olhada.
fonte
Aqui está minha abordagem usando o Swift 2 e o Xcode 7.3. Este exemplo usará um único ViewController para carregar dois arquivos .xib - um para um UITableView e outro para o UITableCellView.
Neste exemplo, você pode soltar um UITableView diretamente em um arquivo TableNib .xib vazio . Dentro, defina o proprietário do arquivo como sua classe ViewController e use uma saída para fazer referência ao tableView.
e
Agora, no seu controlador de exibição, você pode delegar o tableView como faria normalmente, assim
Para criar sua célula Personalizada, solte novamente o objeto Célula de Exibição de Tabela em um arquivo .xib vazio TableCellNib . Desta vez, no arquivo .xib da célula, você não precisa especificar um "proprietário", mas precisa especificar uma Classe Personalizada e um identificador como "TableCellId"
Crie sua subclasse com as saídas necessárias, assim
Finalmente ... de volta ao seu View Controller, você pode carregar e exibir a coisa toda dessa maneira
O código mostra como você pode simplesmente carregar e exibir um arquivo de ponta (a tabela) e, em seguida, como registrar uma ponta para uso da célula.
Espero que isto ajude!!!
fonte
let tableCellId = "myAwesomeCell"
. Eu adicionei outra imagem para ajudá-lo.Swift 4
Registrar Nib
Em TableView DataSource
fonte
Solução detalhada com capturas de tela
MyCustomCell.xib
.UITableViewCell
como raiz do seu arquivo xib e quaisquer outros componentes visuais que desejar.MyCustomCell
como uma subclasse deUITableViewCell
.ctrl+drag
crie saídas para seus componentes visuais.UIViewController
para usar sua célula personalizada.fonte
MyHeaderView.swift
para célula personalizada. O.swift
cabeçalho for vista não temidentifier
emTable View Cell
noAttribute Inspector
. então ... ocorreu um erro no tempo de execução..swift
e dentrotableView?.register(blahblah, forCellReuseIdentifier: "myCell")
? Eu pensei que um deles não é necessário, mas .. Eu achei que os dois são essenciais..xib
para uma célula personalizada possa conter múltiplos,UITableViewCell
então ...xib
não é suficiente para .. encontrar uma célula correta.Você não registrou sua ponta como abaixo:
fonte
Outro método que pode funcionar para você (é como eu faço) é registrar uma classe.
Suponha que você crie um tableView personalizado como o seguinte:
Em seguida, você pode registrar esta célula em qualquer UITableViewController em que a exibirá com "registerClass":
E você pode chamá-lo como seria de esperar no método célula para linha:
fonte
Para corrigir o erro "Substituir método ... tem tipo incompatível ...", alterei a declaração da função para
(foi
-> UITableViewCell!
- com ponto de exclamação no final)fonte
rápido 4.1.2
xib.
Criar ImageCell2.swift
Passo 1
passo 2 . De acordo com a classe Viewcontroller
fonte
Eu tive que ter certeza de que, ao criar a tomada para especificar que eu estava conectando à célula, não ao proprietário do objeto. Quando o menu aparecer para nomear, você deve selecioná-lo no menu suspenso 'objeto'. Obviamente, você deve declarar a célula como sua classe também, não apenas 'TableViewCellClass'. Caso contrário, eu continuaria recebendo a classe que não é compatível com as chaves.
fonte
Simples, faça um xib com a classe UITableViewCell . Defina a interface do usuário conforme a necessidade e atribua IBOutlet. Use-o em cellForRowAt () da exibição de tabela assim:
100% funcionando sem nenhum problema (testado)
fonte