Eu sou bastante novo na codificação em geral e muito novo no Xcode (Swift). Eu entendo que preciso registrar um bico ou uma classe, mas não entendo 'onde ou como?'.
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)
}
}
}
}
Respostas:
Você definiu o identificador Table Cell como "Cell" em seu storyboard?
Ou você definiu a classe para a
UITableViewController
sua classe nessa cena?fonte
Você pode registrar uma aula para o seu
UITableViewCell
como este:Com Swift 3+:
Com Swift 2.2:
Certifique-se de que o mesmo identificador "
cell
" também seja copiado no seu storyboardUITableViewCell
."
self
" é para obter a classe, use o nome da classe seguido por.self
.fonte
viewDidLoad()
tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
Isso funcionou para mim, pode ajudá-lo também:
Swift 4+:
Swift 3 :
Swift 2.2 :
fonte
Tive esse problema hoje que foi resolvido selecionando Produto -> Limpar. Eu estava tão confuso, já que meu código era adequado. O problema começou com o uso de command-Z muitas vezes :)
fonte
No meu caso, resolvi isso nomeando-o na propriedade "Identifier" da Table View Cell:
Não se esqueça: para declarar em sua classe: UITableViewDataSource
fonte
Basta arrastar uma célula (como você fez para TableViewController) e adicioná-la apenas liberando a célula em TableViewController. Clique na célula e. Vá para o inspetor de atributos e defina seu identificador como "Célula". Espero que funcione.
Não se esqueça de que você deseja o Identificador no Inspetor de atributos .
( NÃO o "ID de restauração" no "Inspetor de identidade"!)
fonte
Mais uma razão para esse problema acontecer é um problema anterior. Ao mostrar um novo ViewController, instanciar o ViewController de destino diretamente, obviamente, não carregará as células de protótipo do StoryBoard. A solução correta deve ser sempre instanciar o controlador de visualização por meio do storyboard como este:
fonte
Combine o nome do identificador em ambos os lugares
Este erro ocorre quando o nome do identificador da Tablecell é diferente no arquivo Swift e no Storyboard.
1) O Arquivo Swift
2) O Storyboard
fonte
No Swift 3.0, registre uma classe para seu UITableViewCell como esta:
fonte
Eu tive o mesmo problema. Esse problema funcionou para mim. No storyboard, selecione a visualização da tabela e mude de células estáticas para células dinâmicas.
fonte
Se você definiu sua célula por meio do Interface Builder, colocando uma célula dentro de sua
UICollectionView
, ouUITableView
:Certifique-se de vincular a célula com uma classe real que você criou, e muito importante, que você marcou "Herdar módulo do destino"
fonte
Ele costumava funcionar no swift 3 e no swift 4, mas agora não está funcionando.
gostar
Portanto, tentei a maioria das soluções mencionadas acima no swift 5, mas não tive sorte.
Finalmente tentei essa solução e funcionou para mim.
fonte
Meu problema era que eu estava registrando a célula do table view dentro da fila de despacho de forma assíncrona. Se você registrou a fonte de exibição de tabela e a referência de delegado no storyboard, a fila de despacho atrasaria o registro da célula, pois o nome sugere que isso acontecerá de forma assíncrona e sua exibição de tabela está procurando as células.
Ou você não deve usar a fila de despacho para registro OU fazer isto:
fonte
Acabei de encontrar o mesmo problema e ver este post. Para mim é porque esqueci o conjunto do identificador de celular, também como mencionei nas outras respostas. O que eu quero dizer é que se você estiver usando o storyboard para carregar a célula customizada, não precisamos registrar a célula de visualização de tabela no código, o que pode causar outros problemas.
Veja esta postagem para detalhes:
Célula de visualização de tabela personalizada: o rótulo IBOutlet é nulo
fonte
Apenas para aqueles novos amigos iOS (como eu) que decidiram ter várias células e em um arquivo xib diferente, a solução não é ter identificador, mas fazer isso:
aqui, newsDetails é o nome do arquivo xib.
fonte
Swift 5
você precisa usar o método UINib para registrar a célula em viewDidLoad
fonte
No campo “Subclasse de”, selecione UITableViewController.
O título da classe muda para xxxxTableViewController. Deixe como está.
Certifique-se de que a opção “Também criar arquivo XIB” esteja selecionada.
fonte
Eu encontrei esta mensagem quando UITableView no IB foi movido para outra subvisualização com Cmd-C - Cmd-V.
Todos os identificadores, métodos delegados, links no IB etc. permanecem intactos, mas a exceção é levantada no tempo de execução.
A única solução é limpar todas as tintas, relacionadas ao tableview no IB (saída, fonte de dados, delegado) e torná-las novamente.
fonte