Classe de registre UITableViewCell personnalisée dans Swift
Dans mon application, j'ai à remplir le tableau sur la base de la matrice. Le tableau utilise personnalisé UITableViewCell. Tout fonctionne bien, la table est remplie. Puis-je ajouter de Recherche de Contrôleur d'Affichage à ma UITableViewController, pas d'écrire du code pour gérer la recherche, il suffit d'ajouter le contrôleur. Lorsque vous exécutez l'application, la table est toujours rempli.Mais si j'ai essayer de cliquer sur la barre de recherche, j'obtiens l'erreur:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier CitiesListCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
J'essaie de l'ajouter à ma viewDidLoad fonction dans UITableViewController ligne:
self.tableView.registerClass(MyCell.classForCoder(), forCellReuseIdentifier: kCellIdentifier)
De lancer l'application et obtenir immédiatement l'erreur:
fatal error: unexpectedly found nil while unwrapping an Optional value
En ligne cell.cellMyCity.text = cellText
Ce que je fais mal?
C'est ma Coutume UITableViewCell classe:
import UIKit
class MyCell: UITableViewCell {
@IBOutlet var cellMyImage: UIImageView
@IBOutlet var cellMyCity: UILabel
@IBOutlet var cellMyCountry: UILabel
@IBOutlet var cellMyTemp: 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)
}
}
C'est le code pour la cellule:
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as MyCell!
if cell == nil {
cell = MyCell(style: UITableViewCellStyle.Default, reuseIdentifier: kCellIdentifier)
}
let cellText: String? = dataWeatherSelectedCity[indexPath.row].name as String
println("Строка: \(cellText)")
cell.cellMyCity.text = cellText
let cellSubtitle: String? = dataWeatherSelectedCity[indexPath.row].country as String
cell.cellMyCountry.text = cellSubtitle
cell.cellMyImage.image = UIImage(named: "Blank52")
var currentCityWeatherURL = "http://api.wunderground.com/api/\(self.myAPI.kWundergroundApiKey)/conditions/lang:RU/q/zmw:\(self.dataWeatherSelectedCity[indexPath.row].zmv).json"
var fullObservation:NSDictionary = self.myAPI.jsonParsingWeather(currentCityWeatherURL)
var currentObservation:NSDictionary = fullObservation.valueForKey("current_observation") as NSDictionary
var currentWeather = self.myAPI.parsingOneCityCurrentCondition(currentObservation)
cell.cellMyImage.image = currentWeather.image
cell.cellMyTemp.text = currentWeather.temp
return cell
}
Propriété dans TableViewCell:
Table sans self.tableView.registerClass(MyCell.classForCoder(), forCellReuseIdentifier: kCellIdentifier)
ou self.tableView.registerClass(MyCell.self, forCellReuseIdentifier: kCellIdentifier)
:
source d'informationauteur Alexey Nakhimov
Vous devez vous connecter pour publier un commentaire.
Comme erreur suggèrent que vous êtes l'obtention de votre
cell
ouUITestField
nil
etSwift
ne prend pas en charge d'un appel de méthode sur le zéro de l'objet c'est pourquoi vous obtenez crash. vous pouvez empêcher l'écrasement, par la vérification de l'objet est nul ou pas, comme ci-dessousMODIFIER
Je crois que j'ai ce qui est le problème ici...
Vous avez drag-n-drop
UISearchBar
dans votrestoryboard
Donc par défaut toutes source de données et délégué mis à votre Contrôleur de dire,ViewController
(classe dans laquelle vous remplacer UITableView de source de données, méthodes) et en ce queViewController
vous inscrire MyCell classe personnaliser votre classe.Si votre tableView affiche parfait, mais lorsque vous tapez quelque chose à UISearchBar, la même source de données méthodes (
ViewController
) appelé et là aussi, vous avez des registres MyCell poursearchResultsTableView
(UISearchDisplayController
tableView c'est l'affichage de résultats de recherche), mais qui ne savent pas à propos de MyCell et c'est pourquoicell.cellMyCity
est à venir comme nul dans le cas d'une recherche, cela signifie quesearchResultsTableView
attendre le défautUITableViewCell
et vous n'avez pas réglé quoi que ce soit pour de cellule par défaut comme -tout ce scénario, vous pouvez observer par vous changer de source de données, méthodes comme ci-dessous
Autant que Solution est à craindreil pourrait y avoir deux solution possible..
Un). N'utilisez pas de
searchResultsTableView
(fourni parUISearchDisplayController
) et d'afficher les résultats de votre recherche dans la mêmetableView
que vous avez dans votreViewController
. Pour que ce que vous pouvez faire est - écouter laUISearchBar
délégués lorsque l'utilisateur tapez quelque chose dansUISearchBar
obtenir votre résultat de source de données (Peut être dans différents array) par des Prédicats et Afficher les résultats dans la mêmeUITableView
.B). Personnaliser UISearchDisplayController et l'utilisation de votre cellule personnalisé (j'.e MyCell) dans
searchResultsTableView
ce que j'ai fait pour faire que le travail est quelque chose comme ceci:
REMARQUE: Si j'utilise le
–registerClass(_: forCellReuseIdentifier:)
méthode, le xib fichier ne sera pas chargé, par conséquent, la mesure de l'interface n'apparaîtra pas à moins que vous ajoutez du contenu par programmation de la cellule. si vous souhaitez charger l'interface à partir d'une plume de fichier, vous devez vous inscrire à la cellule avec sa plume.conforme aux protocoles essentiels:
et la cellule personnalisé de classe a été un très générique avec un nom significatif que
UICustomTableViewCell
:avec une assez aléatoire interface:
et ces paramètres de classe personnalisée et la réutilisation de l'identificateur de:
et le résultat final sur mon écran est comme je m'y attendais avec 3 lignes:
REMARQUE: pour plus de personnalisation de la coutume des cellules vous pouvez avoir besoin d'étendre le code ci-dessus.
Mise à JOUR
avec
UISearchBar
le résultat final serait comme ceci:Ajoutant
self
avanttableView
résout les problèmes:assurez-vous de supprimer la classe de registre si vous utilisez la table de montage séquentiel comme il va remplacer le storyboard et tous les outlink associés
veuillez vérifier
https://stackoverflow.com/a/26350795/4453583
il fonctionne pour moi =)
Vous devez n'oubliez pas de vous inscrire à la cellule pour toute tableView que l'utiliser, y compris searchDisplayController.tableView.