Comment importer ses propres classes à partir de son propre projet dans un terrain de jeu

supposons une configuration comme celle-ci:

  • vous avez un projet Xcode 6, où vous avez implémenté vos propres classes (par exemple MyView et MyViewController) avec à la fois Objectif-C et Swift
  • vous avez ajouté un terrain de jeu dans votre projet

dans le terrain de jeu, il est possible d'importer des modules (cadres) comme UIKit avec le mot-clé import . Comment activer l'accès aux autres les classes à partir de l'aire de Jeux?

juste essayer d'accéder à des classes de projet donne directement un résultat avec un message d'erreur: utilisation de l'identificateur non résolu 'MyView'

71
demandé sur Markus Rautopuro 2014-06-04 22:46:56

6 réponses

à partir de Xcode 6.0 Beta 5, il est maintenant possible d'importer vos propres cadres dans un terrain de jeu. Cela fournit une façon de partager le code entre vos applications et les terrains de jeu, qui peuvent tous les deux importer vos cadres. Pour ce faire:

  1. votre terrain de jeu doit être dans le même espace de travail que le projet qui produit votre cadre. Votre espace de travail doit contenir une cible qui produit le cadre, au lieu d'utiliser un pré-cadre bâti.

  2. vous devez avoir déjà construit votre charpente. Si c'est un framework iOS, il doit être construit pour une destination 64 bits (par exemple iPhone 5s), et doit être construit pour le simulateur.

  3. vous devez avoir un schéma actif qui construit au moins une cible (l'emplacement de construction de cette cible sera utilisé dans le chemin de recherche framework pour le terrain de jeu).

  4. Votre "Emplacement De Build" la préférence (dans les paramètres "localisations" avancés de Xcode) ne doit pas être définie à "Legacy".

  5. si votre framework N'est pas un framework Swift, le paramètre de construction" Defines Module "doit être défini à"Oui".

  6. vous devez ajouter une déclaration d'importation à votre terrain de jeu pour le cadre.

une fois toutes ces conditions remplies, l'importation de votre cadre fonctionnera dans un récréation.

dans Xcode 7 Nous avons introduit un autre mécanisme que vous pouvez utiliser pour importer vos propres classes comme source, au lieu d'importer un framework; vous pouvez lire à propos de ce support "sources auxiliaires" à http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af

52
répondu Rick Ballard 2016-10-06 19:53:03

j'ai en fait réussi à me référer à d'autres fichiers Swift dans le projet actuel en faisant ceci:

  • créer un terrain de jeu vide et place est quelque part dans votre projet.
  • ouvrez le paquet YourPlayground.playground (Oui, c'est un paquet = répertoire) dans le Terminal.
  • modifier contents.xcplayground par exemple avec vi et ajouter une autre section comme ceci:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='3.0' sdk='iphonesimulator'> 
   <sections>
       <code source-file-name='section-1.swift'/>
       <code source-file-name='section-2.swift'/>
   </sections>
   <timeline fileName='timeline.xctimeline'/>
</playground>
  • renommer section-1.swift en section-2.swift (si vous avez créé le terrain de jeu à partir de zéro, il devrait y avoir un exemple section-1.swift dans votre paquet)
  • Ajouter un lien dur (le lien symbolique ne semble pas fonctionner) nommé section-1.swift qui pointera à l'extérieur du paquet vers votre fichier de classe Swift comme:
ln ../../Classes/MyView.swift section-1.swift
  • Fermer Xcode et ouvrez le terrain de jeu de nouveau.
  • maintenant, il devrait y avoir deux sections, une avec le contenu de votre fichier de classe Swift et l'autre avec le contenu d'exemple que vous avez obtenu en créant le terrain de jeu à partir de zéro.

de cette façon, je peux réellement exécuter du code gisant à l'extérieur du terrain de jeu, mais Xcode semble se planter plus souvent en le faisant comme ça.

Edit:

selon le Xcode 6 beta 5 vous pouvez maintenant vous référer aux fichiers du projet, comme Rick Ballard l'indique dans sa réponse .

16
répondu Markus Rautopuro 2017-05-23 11:47:17

depuis Beta 5 de Xcode 6, il est possible d'importer votre code s'il est dans un framework. Ce que vous devez faire est de créer une cible framework, ajouter les fichiers Swift là et dans votre terrain de jeu faire

import ModuleName

, Vous pouvez rechercher le nom du module dans les paramètres de construction. C'est généralement le même que le nom de la cible.

N'oubliez pas de faire le code que vous voulez voir public . Vous aurez besoin de construire le projet avant que les changements sont disponibles dans le récréation. (Vous aurez également besoin d'éditer le terrain de jeu pour déclencher la ré-exécution.)

Important

Ne pas donner de l'aire de jeux fichier le même nom que la cible! Si vous le faites, importer semble fonctionner mais vous obtiendrez l'erreur suivante lorsque le terrain de jeu essaie d'exécuter:

L'exécution de terrain de jeu a échoué: erreur: ne pouvait pas rechercher les symboles:

j'ai perdu une heure à le comprendre. :)

12
répondu nschum 2014-08-06 08:31:44

Je n'ai pas pu le faire fonctionner en utilisant l'une des réponses ici, donc j'ai commencé à Jouer et j'ai trouvé un moyen simple qui a fonctionné pour moi d'importer une classe swift dans un terrain de jeu.

il suffit de créer un terrain de jeu dans votre projet, il y a un répertoire appelé 'sources' à l'intérieur, il suffit de glisser une copie de la classe swift dans ce dossier et le terrain de jeu y aura alors accès.

par exemple:

enter image description here

9
répondu de Raad 2015-10-14 02:08:52

je viens de mettre des liens vers tous mes fichiers swift dans le dossier Sources :

cd /path/to/project/MyPlayground.playground/Sources
ln -s ../../*.swift .

de cette façon, les changements dans votre fichier source prendront effet immédiatement dans votre terrain de jeu. a très bien fonctionné .

Xcode 8.2, Swift 3.0.1, macOS Sierra

3
répondu qed 2016-12-15 21:36:10

Tout ce que vous avez à faire - est d'écrire au début:

import ModuleName

(en supposant que votre terrain de jeu est placé dans le même espace de travail que le cadre/projet)

si ça ne marche pas:

  1. Reconstruire votre projet

  2. Recréer une aire de jeux et de copier tous de l'ancienne aire de jeux là

Il résout beaucoup d'étranges erreurs avec init's et importations de n'importe quoi!

-1
répondu skywinder 2017-06-13 07:47:29