0
votes

Accéder aux méthodes de contrôleur d'affichage dans une autre classe [Swift]

J'utilise UitailViefDiffableDataSource code> pour My TateView's DataSource en créant un UitailViefDiffableDAsource code> classe dans mon mode de vueController (animauxvc). Chaque fois que j'essaie d'obtenir la matrice de données de mon ViewController (ou de toute autre variables / fonctions) de l'intérieur de la classe de source de données, j'obtiens cette erreur:

Membre d'instance «Animalareray» de type 'animauxvc' ne peut pas être utilisé sur une instance de type niché 'animauxvc.datasource' code> p>

Je ne suis pas sûr de savoir pourquoi je reçois cette erreur parce que mon cours de DataSource est à l'intérieur de ma classe ViewController. Voici mon code: P>

class AnimalsVC: UIViewController {
   var animalsArray = []

   class DataSource: UITableViewDiffableDataSource<Int, Animal> {
      override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

         let items = animalsArray //<- This is where the error occurs   
         
         return true
      }
   }

}


0 commentaires

4 Réponses :


1
votes

Je ne suis pas sûr de savoir pourquoi obtenir cette erreur parce que ma classe de DataSource est à l'intérieur de la classe ViewController.

Cela ne fait aucune différence. Déclarant une classe à l'intérieur d'un autre simplement les espaces de noms la classe interne, c'est-à-dire appelé maintenant annuellevc.datasource . Il ne provoque pas une instance de la classe intérieure pour pouvoir voir par magie à l'intérieur d'une instance de la classe extérieure (et même il est complètement flou aux instances dont nous parlerions). Votre nidification des déclarations de classe est inutile, vous pourriez aussi bien ne pas le faire.

Au lieu de cela, si DataSource doit voir à l'intérieur des animauxvc, faites ce que vous ferez normalement: Donnez votre instance de DataSource A référence à l'instance annuellevc: xxx

Lorsque vous créez votre instance de données, définissez son VC sur auto . Maintenant, la source de données peut consulter les propriétés d'instance de l'instance Animalvc.

(En réalité, ce que je fais dans mon propre code est donné à ma sous-classe UitablesViewDiffableDAsource une initialisée désignée personnalisée. De cette façon, je peux créer la source de données et Donnez-la une référence au contrôleur d'affichage tout en un mouvement.)


0 commentaires

0
votes

Pour accéder à la classe extérieure de l'intérieur, vous devez transmettre une référence à celle-ci. Il n'est pas automatique, comme avec Java, par exemple.

supposer que l'objet animal est défini ailleurs, ce que vous pouviez faire est: xxx


0 commentaires

0
votes

Les données doivent être contenues dans la classe DataSource. Déplacez votre animalière en classe DataSource.

Si vous avez besoin d'y accéder facilement de n'importe où, déclarez-le sous DataSource comme suit: xxx

Vous pouvez y accéder à partir de n'importe où à l'aide de DataSource.Animalsarray, telle que: < / p> xxx

Je suppose que vous pouvez le créer comme un Var statique sous animauxvc à la place, mais les données doivent vraiment être déclarées dans la source de données.

Cela ferait Votre classe ressemble à ceci: xxx


0 commentaires

0
votes

Ce n'est pas possible parce que.

"Nééthypes" Il n'est pas possible d'accéder au membre ou à la fonction d'instance dans une autre classe, même la classe de conteneurs contrairement à "héritage" que vous pouvez Membre d'instance d'accès ou fonction de la classe mère. P> blockQuote>

Si vous souhaitez que votre travail de mise en œuvre sans erreur. "Statique" vous aidera. P> xxx pré>

test. P>

let vc = AnimalVC()
vc.load()


0 commentaires