2017-10-14 3 views
0

Je reçois cette erreur. Je travaille avec SQLite. J'ai quelques données et je veux afficher les données dans les sections ainsi j'ai ajouté une colonne qui sera mon nom de section, appelé "cittaTerritorio". Maintenant, je suis train de les récupérer mes données et le tri à l'aide de cette colonne, Quand je lance le crash de tout code avec ce message:UITableView non reconnu NumberOfRowsInSection

- [UIView tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à l'instance 0x101c3ce50 2017- 10-14 17: 14: 44.893258 + 0200 MinistryHelp [403: 44322] * Terminaison de l'application due à l'exception non interceptée 'NSInvalidArgumentException', raison: '- [UIView tableView: numberOfRowsInSection:]: sélecteur non reconnu envoyé à l'instance 0x101c3ce50' * Pile d'appel du premier jet: (0x1812b3d38 0x1807c8528 0x1812c11f8 0x18aa7bcc4 0x1812b96e4 0x18119f0dc 0x18aa02cc8 0x18a7908d8 0x18a7900a4 0x18a78fe34 0x18a7 8fc44 0x18a81c14c 0x1008cfc60 0x1008cf040 0x1008cfedc 0x18a6c3bfc 0x18a76c128 0x18a76b5c8 0x18a76afcc 0x18a76aa34 0x18a76a95c 0x18a6c1000 0x1852910b4 0x185295194 0x185203f24 0x18522a340 0x18522b180 0x18125b8b8 0x181259270 0x18125982c 0x18117a2d8 0x18300bf84 0x18a727880 0x1008c62d0 0x180c9e56c) libC++ abi.dylib: mettre fin à l'exception du type uncaught NSException

Avez-vous une idée? C'est mon code:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return self.listCitta()[section] 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.territoriInCitta(section: section).count 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return self.listCitta().count 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.listCitta().count 
} 

func territoriInCitta(section: Int)-> [String]{ 
    let nomeSezione = tableview.headerView(forSection: section)?.textLabel?.text 
    var listaCitta = [String]() 
    listaCitta.removeAll() 
    do{ 
     let territori = try self.database.prepare(territoryTable.filter(cittaTerritorio == nomeSezione!)) 
     for territorio in territori{ 
      listaCitta.append(territorio[self.cittaTerritorio]) 
     } 
    }catch{ 
     print(error) 
    } 
    return listaCitta 
} 

func listCitta()-> [String]{ //aggiunge i vari nomi delle citta 
    var listaCitta = [String]() 
    listaCitta.removeAll() 
    do{ 
     let terr = try self.database.prepare(territoryTable.select(cittaTerritorio)) 
     for territorio in terr{ 
      if listaCitta.contains(territorio[self.cittaTerritorio]){ 
       //nil 
      } 
      else{ 
       listaCitta.append(territorio[self.cittaTerritorio]) 
      } 
     } 
    }catch{ 
     print(error) 
    } 
    return listaCitta 
} 

avec la première fonction i obtenir le nom des sections en fonction de l'indice de la liste des mes déclarations de méthode. La deuxième fonction renvoie le nombre de données basé sur la section afin que je filtre les données basées sur ce nom de section et que renvoyer le nombre en utilisant une liste. la troisième et la quatrième méthode renvoient le nombre de sections.

J'ai également essayé d'insérer de fausses données, en écrivant un nombre à des fins de test, rien ne s'est passé différemment.

+0

La signature de 'numberOfRowsInSection' est incorrecte. Commentez la méthode et retapez-la en utilisant l'achèvement de code ou recherchez la méthode dans la documentation [UITableViewDataSource] (https://developer.apple.com/documentation/uikit/uitableviewdatasource). – vadian

+0

PS: Et ** jamais ** les opérations de base de données dans 'numberOfRows' et' numberOfSections'. Ces méthodes sont appelées très souvent. Créez un tableau de sources de données et récupérez vos données une fois. – vadian

+0

J'ai vu que le problème était qu'en quelque sorte j'avais 2 méthodes numberOfRowsInSection – John

Répondre

-1

avez-vous défini tous les délégués et les sources de données? si non, essayez ceci dans viewDidLoad() Méthode:

override func viewDidLoad() { 
    super.viewDidLoad() 
    myTableView.delegate = self 
    myTableView.dataSource = self 
} 

si cela ne fonctionne pas pour vous, laissez-moi savoir, je vais essayer de penser plus.

+0

Oui, je l'ai déjà fait – John

1

Ne pas deviner la bonne signature pour la méthode. Il y a deux façons de bien faire les choses.

  1. La meilleure option est de laisser Xcode vous donner la bonne signature. Commencez à taper le nom (par exemple "numberOfRows") et Xcode affichera les méthodes de correspondance possibles. Sélectionnez le bon.
  2. L'autre option consiste à copier la bonne signature à partir de la documentation de référence.

Voici la signature de la méthode correcte:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

Il vous manque le trait de soulignement.

Et pourquoi avez-vous deux tentatives à la méthode numberOfSections? Utilisez simplement la bonne:

func numberOfSections(in tableView: UITableView) -> Int 

Vous avez probablement copié et collé des exemples de code Swift 2.L'API change beaucoup à Swift 3.

à votre question non relié (comme mentionné dans les commentaires), ne remet pas listCitta() de toute votre vue de la table source de données ou méthodes de délégué. Vous devriez appeler cela une fois (par exemple viewDidLoad) et utiliser une propriété pour conserver le tableau des résultats. Ensuite, vos méthodes de source de données et de délégué doivent simplement accéder à cette propriété.