Utilisation du type non déclaré 'AppDelegate' Swift
Je viens de passer une demi-journée à essayer de résoudre un autre problème.
Je suis en train de tester le CoreData l'utilisation de Swift de la langue.
Suivez cette tutoriel tout fonctionne bien.
Mais après titorial j'ai essayé de modifier le structure et mon code. Le " src " et des groupes à l'intérieur c'est des dossiers, et pas seulement les groupes créés par xCode.
NSSExpense.swift
import Foundation
import CoreData
class NSSExpense: NSManagedObject {
@NSManaged var name: String
@NSManaged var descr: String
@NSManaged var value: NSNumber
@NSManaged var isMonthly: NSNumber
@NSManaged var payDayInMonth: NSNumber
class func createInManagedObjectContext(moc: NSManagedObjectContext, name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
let newExpense = NSEntityDescription.insertNewObjectForEntityForName("NSSExpense", inManagedObjectContext: moc) as NSSExpense
newExpense.name = name
newExpense.value = NSNumber(double: value)
newExpense.payDayInMonth = NSNumber(short: payDayInMonth)
newExpense.isMonthly = NSNumber(bool: isMonthly)
if let expenseDesctiption = descr {
newExpense.descr = expenseDesctiption
} else {
newExpense.descr = ""
}
return newExpense
}
}
NSSDataManager.swift
import UIKit
import CoreData
class NSSDataManager: NSObject {
class var sharedDataManager: NSSDataManager {
struct Static {
static var instance: NSSDataManager?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = NSSDataManager()
}
return Static.instance!
}
lazy var managedObjectContext : NSManagedObjectContext? = {
//Error at the next line "Use of undeclared type 'NSSAppDelegate'"
let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate
if let managedObjectContext = appDelegate.managedObjectContext {
return managedObjectContext
} else {
return nil
}
}()
var expensesInMemory : [NSSExpense] {
get {
let fetchRequest = NSFetchRequest(entityName: "NSSExpense")
if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSSExpense] {
return fetchResults
} else {
return [NSSExpense]()
}
}
}
func addExpenseWithName(name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
return NSSExpense.createInManagedObjectContext(managedObjectContext!, name: name, value: value, payDayInMonth: payDayInMonth, isMonthly: isMonthly, descr: descr?)
}
}
J'ai essayé de résoudre ce problème de différentes manières:
1) Créer un nouveau projet (Swift langue principale) et de faire la même structure (échec)
2) Créer un nouveau projet (Objective-C langue principale). Donc, j'ai l'AppDelegate.h et AppDelegate.m. Ajouter à Swift de fichiers à l'aide de Transition-d'en-Tête. Le même problème. (échec)
Vraiment intéressant prochaine chose. Si je mets de côté le code pour le ViewController.swift qui crée automatiquement avec un nouveau projet tout fonctionne bien. Mais quand je mets ce code à toute autre catégorie. J'ai ce code d'erreur.
lazy var managedObjectContext : NSManagedObjectContext? = {
//Error at the next line "Use of undeclared type 'NSSAppDelegate'"
let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate
if let managedObjectContext = appDelegate.managedObjectContext {
return managedObjectContext
} else {
return nil
}
}()
[JOUR 1]
J'ai essayé de créer une autre classe à droite à le même dossier que NSSAppDelegate.swift et maintenant tout fonctionne très bien. Cependant il reste un problème, comment puis-je utiliser les classes qui en stockées dans d'autres dossiers?
[Mise à JOUR 2]
Juste essayé de faire la même chose dans d'autres projets.
Si la structure du fichier est comme cette donc l'AppDelegate.swift et NGDataManager.swift sont dans le même dossier tout fonctionne très bien.
MAIS, si je mets de la NGDataManager.swift à l'intérieur de la 'src' dossier comme cette (et pas seulement groupe de, dossier) le erreur se produit. Peut-être que je devrais créer l'autre question pour cela.
[JOUR 3]
Je ne sais pas comment, mais vous pouvez oublier tout ce que j'ai dit dans UDATE 2. Parce que Maintenant c'est tout pas de travail. J'ai même créer un nouveau projet avec CoreData nommé "Test" et il suffit de créer une nouvelle classe nommée "TestClass". La magie est dans la chose suivante: si j'ai mis ce code à l'intérieur de la TestClass.swift
import UIKit
class TestClass: NSObject {
func someFunc() {
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
l'erreur se produit. Mais si j'ai mis cette ligne dans le viewDidLoad dans ViewController.swift qui a été généré automatiquement par xCode
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
n'est pas leur erreur et tout fonctionne très bien. Je ne sais pas quoi dire...
Vous pouvez voir l'AppDelegate code ici mais je n'ai pas modifier quoi que ce soit généré automatiquement par xCode. J'ai créé une Vue Unique de l'Application avec cette paramètres.
source d'informationauteur Doshipak
Vous devez vous connecter pour publier un commentaire.
Les Chances sont quand vous avez créé votre projet, vous avez également créé un '{ProjectName}Tests " de la cible. Le problème est AppDelegate n'est pas affecté l'adhésion à l' '{ProjectName}Tests " de la cible.
Sélectionnez AppDelegate.swift ensuite dans la partie droite de l'inspecteur, cliquez sur le Fichier Inspecteur (l'icône papier), alors assurez-dans la "Cible d'Adhésion" à la fois votre projet et le test de la cible coches sont SUR on.
Nettoyer, reconstruire.
Si vous essayez d'accéder à un Objectif-C AppDelegate dans le code Swift, assurez-vous d'avoir
#import "AppDelegate.h"
dans votre transition fichier d'en-tête.Cela m'avait bloqué pendant une heure environ :-/
J'ai eu un problème similaire a été résolu quand j'ai fait un "Nettoyage" de l'option dans le menu Produit
Assurez-vous que la Cible Adhésions sont les mêmes dans chaque fichier. Cible les adhésions peuvent être trouvés dans l'inspecteur des propriétés lorsque vous cliquez sur un fichier spécifique.
Elle suppose d'être comme ça.
Rencontré ce problème dans Xcode 8 et c'était le premier résultat quand j'ai cherché sur google afin d'ajouter ma solution.
Si votre projet a l'INTERFACE utilisateur et les Tests Unitaires, assurez-vous que votre AppDelegate est ajoutée à la fois la cible des adhésions. Une fois que je l'ai ajouté à mes Tests, j'ai été en mesure d'accéder à toutes les variables que j'ai eu dans mon AppDelegate sans avoir à utiliser
UIApplication.shared
indépendamment de la façon dont mes fichiers ont été regroupés.Pour vérifier, allez dans votre AppDelegate, cliquez sur le fichier de l'inspecteur, et de regarder
Target Membership
.Au lieu de:
essayer: