Pousser des enchaînements de UITableViewCell à ViewController en Swift
Je rencontre des problèmes avec mon UITableViewCells. J'ai connecté mon UITableView à une API pour remplir mes cellules.
Ensuite, j'ai créé une fonction qui attrape le indexPath.row
pour identifier le JSON-objet à l'intérieur du tableau qui doit être envoyée à l' RestaurantViewController
.
Lien vers mon Projet Xcode pour faciliter le débogage et de résolution de problème
Voici comment mon petit extrait de regards pour le réglage de la ligne "-clique sur" à une variable globale.
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
i = indexPath.row
}
Et voici mon prepareForSegue()
fonction qui doit raccorder mon push-segue à la RestaurantViewController
.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "toRestaurant"{
let navigationController = segue.destinationViewController as UINavigationController
let vc = navigationController.topViewController as RestaurantViewController
vc.data = currentResponse[i] as NSArray
}
}
Et voici comment j'ai configuré mon segue de la UITableViewCell
Voici mon résultat, j'ai essayé de cliquer sur chaque seule de ces cellules mais je ne vais pas être poussé à l'autre viewController...je n'ai pas une erreur. Quel est le problème ici?
Essayé des solutions qui ne fonctionnent pas
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "toRestaurant"{
let vc = segue.destinationViewController as RestaurantViewController
//let vc = navigationController.topViewController as RestaurantViewController
vc.data = currentResponse[i] as NSArray
}
}
J'ai commenté
let vc = navigationController.topViewController as RestaurantViewController
et édité la ligne ci-dessus pour "RestaurantViewController". Compilé et exécuté, aucune erreur, tout simplement pas de réponse de cliquer sur les cellules.Je viens de vérifier que la pression segue est obsolète, je ne suis pas sûr, mais que faire si vous changez que de Montrer (par exemple, Pousser) ?
Vérifiez que la séquence est déclenchée sur la cellule de sélection (les connexions à l'inspecteur de la cellule) et pas autre chose.
Mes choix sur des enchaînements types sont
Push, Modal, Popover, Replace, Custom
OriginalL'auteur Jack | 2015-02-04
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous n'êtes pas le traitement de vos données correctement.
Si vous regardez dans votre
currentResponse
Tableau, vous verrez qu'il détient NSDictionaries mais dans votreprepareForSegue
vous essayez de lancer un NSDictionary à un NSArray, qui permettra à l'application crash.Changer le
data
variable dansRestaurantViewController
à un NSDictionary et de changer votreprepareForSegue
passer un un NSDictionaryself.tableData = results as NSDictionary!
. L'erreur est:'NSDictionary' is not convertible to 'NSArray'
en ce qui viewcontroller?
AutomaticCitySelectionViewController
pas de. ne pas modifier cette ligne. vous gardez votre tableData comme un NSArray. Mais à l'intérieur de ce Tableau que vous avez NSDictionaries. Si vous avez besoin de changer la
data
variable dans RestaurantViewController à un NSDictionaryAinsi, sur certaines lignes, nous avons
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { return tableData.count }
Ma demande pauses ici, dois-je en quelque sorte essayer de nid de sortir des tableaux et de les renvoyer?OriginalL'auteur ergoon
Les étapes suivantes devrait résoudre votre problème. Si non, s'il vous plaît laissez-moi savoir.
Supprimer votre
tableView(tableView, didSelectRowAtIndexPath:)
mise en œuvre.Faire
data
surRestaurantViewController
de typeNSDictionary!
Déterminer la ligne sélectionnée dans
prepareForSegue
:(lldb)
et le Thread 1 s'ouvre (swift_dynamicCastObjCClassUnconditional
).Lien vers mon projet Xcode
L'obtention de l'erreur sonne comme 90% de la sorte. Si vous remplacez les recoins les plus profonds de deux lignes avec
println(segue.destinationViewController!)
, ce que vous obtenez en sortie?<DalaLunch.RestaurantViewController: 0x7ffb99492400>
est ma sortie maintenantEt la manette est poussée, seulement sans les données, droit?
OriginalL'auteur Tammo Freese
Dropbox lien vers stack3 répertoire
Je vais avoir de la difficulté à comprendre pourquoi votre logiciel est bien différente de celle d'une norme de niveau 2 de la tableview structure. Donc j'ai codé un petit exemple qui vous pouvez accéder à partir de ce lien. J'ai aussi inclus les sources de code ci-dessous.
Le programme imite ce que vous avez (du mieux que j'ai compris). Tableau de commande 1 enchaîne à la Table du Contrôleur 2 de la tableview cellule. J'ai pas eu de problèmes avec segue-ing. Notez que je n'ai pas et ont besoin de renforcer le livre d'histoires pour lancer la séquence.
J'ai intégré à la fois les contrôleurs les Contrôleurs de la Navigation. Mon expérience est qu'il permet d'économiser beaucoup d'effort pour mettre en place la navigation.
En alternance, j'ai pu avoir le contrôle-glissé à partir de la première TableViewController symbole en haut de l'écran pour la deuxième contrôleur et de définir la séquence.
J'ai utilisé une variable globale (selectedRow) bien qu'il n'est pas recommander la pratique. Mais vous avez tout aussi bien utiliser le prepareForSegue pour définir une variable dans le RestaurantTableViewController (je montre un exemple)
Malheureusement, je ne peux pas obtenir le code correctement formateur
OriginalL'auteur Syed Tariq
J'ai remarqué que dans votre capture d'écran de votre scénario, la séquence est la connexion du premier prototype de cellule pour l'
RestaurantViewController
. Ce prototype de cellule dirait que c'est la "Base" du style de cellule avec une divulgation de l'indicateur de l'accessoire sur la droite. Mais regardez la capture d'écran de votre application en cours d'exécution. La table est remplie avec des cellules qui semble être le "sous-titres" style de cellule sans une divulgation de l'indicateur de l'accessoire sur la droite.La raison que votre segue n'est jamais tir peu importe ce que vous faites, c'est que la séquence est configuré de travail pour un prototype de cellule, mais que le prototype de la cellule est de ne jamais être utilisé lorsque vous remplissez le tableau. Quoi que vous fassiez dans
tableView:cellForRowAtIndexPath:
, vous n'êtes pas en utilisant le prototype de cellule que vous souhaitez.@Starscream a la bonne idée dequeueing la cellule de droite avec le bon identifiant et correspondance avec l'identificateur du prototype de cellule dans Interface Builder. L'incident que vous allez obtenir, même après avoir fait cela pourrait être en raison de la précédente problème mentionné dans les commentaires ci-dessus. Votre segue dans le storyboard est clairement orientée vers un
UITableViewController
. Votre code dansprepareForSegue:sender:
devrait êtrelet vc = segue.destinationViewController as RestaurantViewController
, aussi longtemps queRestaurantViewController
est une sous-classe deUITableViewController
. Vous aurez en panne si vous essayez de le jeter comme unUINavigationController
. Assurez-vous également que la classe pour la destinationUITableViewController
dans le storyboard est répertorié commeRestaurantController
dans l'Identité de l'Inspecteur de volet. Vous aurez en panne si votre programme compile en pensant que le storyboard ne contient qu'un génériqueUITableViewController
.Pour en revenir au problème initial plus, je ne sais pas comment vous avez mis en œuvre
tableView:cellForRowAtIndexPath:
, ce qui pourrait être crucial. C'est peut-être pas si simple. Peut-être que vous prévoyez sur la gestion de nombreux prototypes de cellules ou générez des cellules lors de l'exécution. Dans ce cas, une façon de faire ce simple pour vous est de programmation pour effectuer la séquence lorsque l'utilisateur appuie sur une cellule. Au lieu d'utiliser un spécifique prototype de cellule, de faire la transition d'une connexion provenant de la "Restauranger nära mig"UITableViewController
aller à laRestaurantViewController
. (Connectez dans Interface Builder, par le contrôle-cliquez sur le déplacement de la Table View Controller icône en haut de la première sur le corps de la seconde). Vous devez donner à cette segue un identifiant dans les Attributs de la fenêtre Inspecteur pour le rendre utile. Disons que c'est"toRestaurant"
. Puis à la fin de votretableView:didSelectRowAtIndexPath:
méthode, de mettre cette ligne de code:self.performSegueWithIdentifier("toRestaurant", sender: self)
. Maintenant, peu importe ce que la cellule est sélectionnée dans le tableau, cette séquence se déclenche pour vous.OriginalL'auteur Christopher Whidden
Essayer de créer des cellules de ce genre dans votre
cellForRow
méthode:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier MyTestCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
La cellule que vous avez lié votre segue à l'IB doit avoir une réutilisation identificateur défini comme "MyTestCell"
Ajouté le
MyTestCell
à la TableViewCell identificateur et a obtenu un ma console a écrit(lldb)
dans le texte en vert et ouvert le thread. Il dit :EXC_REAKPOINT
Pas d'autres suggestions? Je suis coincé ici..
OriginalL'auteur Starscream
Je pars sur un coup de tête car je me suis juste d'entrer dans l'swift pour l'instant, mais la façon dont je le fais dans mon
prepareForSegue()
est quelque chose comme ceci:À quoi il ressemble pour moi, c'est que vous êtes à l'appel de la variable i qui est une sorte de variable privée à l'intérieur d'une méthode de votre classe. Vous pouvez faire quelque chose comme @Syed Tariq a fait avec la
selectRow
variable et fixé au-dessus de votreclass SomeController: UIViewController /*, maybe some more here? */{
et ensuite signer la variable à l'intérieur de votreméthode comme ci-dessus, mais les deux façons devrait fonctionner plutôt bien.
prepareForSegue()
mais pas de chance, et quetableView
méthode aussi bien avec eachother. Je viens de recevoir l'erreur0x102883662: nopw %cs:(%rax,%rax)
en cliquant sur la ligne du tableau.Peut-être il pourrait être votre
currentResponse
? Je ne sais pas ce que c'est exactement. Avez-vous enregistré quelque part?Ne le pense pas, C'est un vide
NSArray
qui est renseigné dans une fonction.Est-ce quelque chose comme ceci:
class GamesTableViewController: UITableViewController { var currentResponse:NSArray? }
Car autant que je sache, vous devez le déclarer au sommet de la classe pour l'utiliser ailleurs dans la classe. Vous pouvez ensuite définir dans d'autres domaines tels que:func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { currentResponse[indexPath.row] }
Ou dans votreprepareForSegue()
méthodeessayez quelque chose comme ceci: pastebin.com/Gm6kaV1T
OriginalL'auteur KyleMassacre
J'ai eu le même problème et j'ai trouvé la solution:
performSegueWithIdentifier("toViewDetails", expéditeur: auto)
OriginalL'auteur João Henrique
Vous devrez peut-être obtenir de la cellule sélectionnée indice de la UItableview. Ci-dessous le code utilisé la cellule sélectionnée index (UItableview.indexPathForSelectedRow) pour obtenir un bon élément de la matrice.
OriginalL'auteur Chamath Jeevan