2017-10-13 13 views
0

J'ai une application dans Swift3 qui se compose de 2 UITableView différents qui montrent les détails d'un actif de classe. Le contenu des données dans les deux tableaux est identique/similaire (il y a quelques filtres), la présentation est différente. Donc, un de ces UIViewTables montre par exemple des commentaires pour chaque actif et l'autre est plus axé sur le statut.Swift3 et Segue: deux UITableViewController différents point à un UIView

Si un utilisateur clique sur une cellule de tableau, les deux UITableViews ouvrent la même UIView pour obtenir tous les détails, car les deux tables représentent les mêmes données à la fin.

J'ai inclus un UINavigationControl et créé un segment pour chaque TableCell. Si je clique sur les cellules, l'écran de détail correct s'ouvre. Mais si je le sauvegarde, cela me ramène toujours à la première table, même si je commence à partir de la seconde.

Quelqu'un peut-il me donner un indice?

Voici ma méthode de préparation DetailViewController qui est appelée lorsque je clique sur le bouton de sauvegarde.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    super.prepare(for: segue, sender: sender) 

    print(segue.identifier) 

    // Configure the destination view controller only when the save button is pressed. 
    guard let button = sender as? UIBarButtonItem, button === btnSave else 
    { 
     //os_log("The save button was not pressed, cancelling", log: OSLog.default, type: .debug) 
     return 
    } 

    asset?.name = tfDeviceName.text ?? "" 
    //here comes some other stored asset information... 
} 

Voici mon premier UITableViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    super.prepare(for: segue, sender: sender) 

    switch(segue.identifier ?? "") 
    { 

    case "AddItem": 
     os_log("Adding a new asset.", log: OSLog.default, type: .debug) 

    case "ShowDetails": 
     guard let assetDetailViewController = segue.destination as? DetailViewController else { 
      fatalError("Unexpected destination: \(segue.destination)") 
     } 

     guard let selectedAssetCell = sender as? AssetTableViewCell else { 
      fatalError("Unexpected sender: \(String(describing: sender))") 
     } 

     guard let indexPath = tableView.indexPath(for: selectedAssetCell) else { 
      fatalError("The selected cell is not being displayed by the table") 
     } 

     selectedIndex = indexPath.row 

     let selectedAsset = assets[indexPath.row] 
     assetDetailViewController.asset = selectedAsset 

    default: 
     fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))") 
    } 
    editMode = true 
} 

Ceci est mon deuxième UITableViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    super.prepare(for: segue, sender: sender) 

    switch(segue.identifier ?? "") { 

    case "AddItem": 
     os_log("Adding a new asset.", log: OSLog.default, type: .debug) 

    case "ShowTask": 
     guard let taskDetailViewController = segue.destination as? DetailViewController else { 
      fatalError("Unexpected destination: \(segue.destination)") 
     } 

     guard let selectedAssetCell = sender as? TaskTableViewCell else { 
      fatalError("Unexpected sender: \(String(describing: sender))") 
     } 

     guard let indexPath = tableView.indexPath(for: selectedAssetCell) else { 
      fatalError("The selected cell is not being displayed by the table") 
     } 

     let selectedAsset = assets[indexPath.row] 
     taskDetailViewController.asset = selectedAsset 

    default: 
     fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))") 
    } 
} 

Et voici mon histoire Conseil enter image description here

Merci! BR Stefan

EDIT AVEC LA SOLUTION:

Thx à des conseils Duncans j'ai trouvé mon problème. L'action de déroulement est attachée au bouton de sauvegarde dans le constructeur de l'interface en faisant glisser le bouton sur l'événement exit et en sélectionnant ensuite la méthode de déroulement. Et voici la chose importante: Vous ne pouvez sélectionner qu'une seule méthode, mais pas la classe. La classe est sélectionnée automatiquement par le système qui gère la navigation, mais les deux méthodes (évidemment) doivent avoir le même nom de déroulement. J'ai fait une faute de frappe pour que la méthode unwind dans la deuxième UITableView soit légèrement différente et ensuite les systèmes ne trouvent pas la méthode dans le UITableView correct et saute à un UITableView qui a la bonne méthode même si cette classe n'était pas la version originale

Répondre

0

Comment revenez-vous de votre DetailViewController vers le contrôleur de vue de table appelant? Il me semble que vous utilisez un segue normal, ce qui est faux.

Vous pouvez utiliser un Segue dérouleur, ou l'inverse de ce que la méthode utilisée pour y arriver (si vous utilisez un Segue push, appelez pop(), si vous utilisez un cadeau modal, appelez dismiss().)

+0

J'utilise ces tutoriels officiels d'apple, avec la différence que j'ai 2 tables et pas seulement une (https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementNavigation.html#//apple_ref/doc/ uid/TP40015214-CH16-SW1). Comme indiqué dans mon snipped, mes appels de bouton de sauvegarde se préparent dans mon DetailViewController, stocke les changements dans mon actif, puis revient en arrière (dans le mauvais tableau). Il existe des méthodes unwind dans les deux UITableViews pour réagir sur le déroulement. Y a-t-il un moyen de régler le bon segment?Comme dans le didacticiel, je n'appelle jamais ignorer, uniquement lorsque "annuler" – user3354754

+0

"Comme indiqué dans mes extraits de code, mes appels de bouton de sécurité se préparent ..." Vous n'avez pas envoyé de code depuis l'action du bouton de sauvegarde de DetailViewController. C'est le code que nous devons voir. Vous dites "... mes appels de bouton de sauvegarde se préparent dans mon DetailViewController, stocke les changements dans mon actif, puis revient (à la mauvaise Table)." Que voulez-vous dire par "les appels se préparent"? Et que veux-tu dire par "reculer"? Montre ce code. –

+0

Ah ok j'ai trouvé mon erreur, j'ai contrôlé-déplacé mon bouton de sauvegarde dans le story-board du canevas vers l'évènement Exit et j'ai sélectionné le déroulement de segne de tableview. Je suppose qu'il est possible de changer dynamiquement la méthode de déroulement de la table correcte dans le code :) – user3354754