2014-11-19 16 views
9

Ich habe gerade einen halben Tag damit verbracht, das nächste Problem zu lösen. Ich teste die CoreData mit Swift-Sprache. Folgen Sie this Tutorial alles funktioniert gut.Verwendung des nicht deklarierten Typs 'AppDelegate' Swift

Aber nach Titorial habe ich versucht, die structure und meinen Code zu ändern. Die 'src' und Gruppen darin sind Ordner, nicht nur Gruppen, die von xCode erstellt wurden.

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?) 
    } 

} 

Ich habe versucht, dieses Problem verschiedene Arten zu lösen: 1) Neues Projekt erstellen (Swift Hauptsprache) und machen die gleiche Struktur erneut (fehlgeschlagen) 2) Neues Projekt erstellen (Zielsprache C). Also ich habe die AppDelegate.h und AppDelegate.m. Fügen Sie Swift-Dateien mit Bridging-Header hinzu. Dasselbe Problem. (gescheitert)

Wirklich interessante nächste Sache. Wenn ich den nächsten Code auf den ViewController.swift setze, der automatisch mit neuem Projekt erstellt, funktioniert alles einwandfrei. Aber wenn ich diesen Code in eine andere Klasse lege. Ich habe diesen Fehler programmiert.

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 
     } 
    }() 

[UPDATE 1]

Ich habe versucht, eine andere Klasse direkt im selben Ordner wie NSSAppDelegate.swift zu schaffen und jetzt alles funktioniert. Es ist jedoch immer noch ein Problem, wie kann ich die Klassen verwenden, die in anderen Ordnern gespeichert sind?


[UPDATE 2]

Gerade versucht das Gleiche in anderen Projekt zu tun. Wenn die Dateistruktur wie this ist, also AppDelegate.swift und NGDataManager.swift im gleichen Ordner sind, funktioniert alles super. ABER, wenn ich den NGDataManager.swift innerhalb des 'src' Ordners wie this (nicht nur Gruppe, Ordner) die error auftritt. Vielleicht sollte ich dafür die andere Frage stellen.


[UPDATE 3]

Ich weiß nicht, wie, aber Sie können alle vergessen, die ich in UDATE 2. Nun gesagt habe, weil das ist alles nicht funktionieren. Ich erstelle sogar ein neues Projekt mit CoreData namens "Test" und erstelle einfach eine neue Klasse namens "TestClass". Die Magie ist in der nächsten Sache: Wenn ich diesen Code in der TestClass.swift setzen

import UIKit 

class TestClass: NSObject { 
    func someFunc() { 
     let appDel = UIApplication.sharedApplication().delegate as AppDelegate 
    } 
} 

der Fehler auftritt. Aber wenn ich diese Zeile in viewDidLoad in ViewController.swift setzen, die wurden automatisch generiert durch xCode

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let appDel = UIApplication.sharedApplication().delegate as AppDelegate 
    } 
} 

sie ist kein Fehler, und alles funktioniert super. Ich weiß nicht, was ich sagen soll ...

Sie können den AppDelegate-Code here sehen, aber ich habe nichts geändert, das automatisch von xCode generiert wird. Ich habe eine Einzelansicht-Anwendung mit this Einstellungen erstellt.

+0

'NSSAppDelegate' - was soll das sein? Sicher ist es 'NSApplicationDelegate'? – Grimxn

+0

Sie sollten Ihren Klassen nicht mit 'NS' vorangestellt werden, da Sie in Zukunft mit allerlei Problemen konfrontiert werden. – sbarow

+0

@sbarow das ist mein Firmenpräfix NSS. Aber sicher, dass Sie Recht haben, wird das andere Präfix erstellen. Allerdings habe ich versucht, die AppDelegate, ohne das Präfix zu verwenden, zeigen Sie nur die letzte Codeversion hier. – Doshipak

Antwort

0

Statt:

let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate 

Versuch:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
+0

Ich habe das schon mal probiert. Das gleiche Problem. Siehe das Update der Frage. – Doshipak

46

Die Chancen stehen gut, wenn Sie Ihr Projekt erstellt Sie auch erstellt '{} Projektname Tests' Ziel. Das Problem ist, dass AppDelegate keine Mitgliedschaft im Ziel "{ProjectName} Tests" zugewiesen ist.

Wählen Sie AppDelegate.swift, dann klicken Sie im rechten Inspektor auf den Datei-Inspektor (das Papiersymbol) und stellen Sie sicher, dass in der "Target-Mitgliedschaft" sowohl Ihr Projekt als auch die Testziel-Häkchen auf EIN gesetzt sind.

Reinigen, neu aufbauen.

+0

@Tieme Es ist nicht für mich gearbeitet ( Ich denke, dass der Hauptgrund ist, weil ich die Klasse in den anderen Ordner erstellt, nicht in dem gleichen Ordner wie AppDelegate.swift Datei ich nächste Struktur haben:. MyProjFolder: { AppDelegate .swift srcFolder: { SomeClass.swift}} SomeClass.swift sehen AppDelegate nicht in seiner Tragweite – Doshipak

+0

das ist nicht – Tieme

+0

@Tieme Rolle, sollte aber ich bin es in mehreren Projekten versucht dies mehrmals, und wenn ich setzen.. die Klasse im anderen Ordner, diese Klasse kann AppDelegate nicht sehen – Doshipak

3

Ich hatte ein ähnliches Problem, das gelöst wurde, als ich eine „saubere“ Option im Produktmenü

2

Vergewissern Sie hatte die Zielmitgliedschaft das gleiche in jeder Datei. Zielmitgliedschaften finden Sie im Eigenschafteninspektor, wenn Sie auf eine bestimmte Datei klicken.

2

Es soll so sein.

let appDelegate: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
9

Wenn ein Objective-C AppDelegate in Swift Code zuzugreifen versuchen, stellen Sie sicher, dass Sie #import "AppDelegate.h" in Ihrer Überbrückung Header-Datei haben.

Das hatte mich für etwa eine Stunde stecken: -/

+0

Danke, meine Stunde gespeichert –

0

Lief in dieser Ausgabe in Xcode 8 und dies war das erste Ergebnis, wenn ich auf Google gesucht, so meine Lösung hinzufügen.

Wenn Ihr Projekt über UI- und Unit-Tests verfügt, stellen Sie sicher, dass Ihr AppDelegate zu beiden Zielmitgliedschaften hinzugefügt wird. Sobald ich es meinen Tests hinzugefügt hatte, konnte ich auf alle Variablen zugreifen, die ich in meinem AppDelegate hatte, ohne UIApplication.shared verwenden zu müssen, unabhängig davon, wie meine Dateien gruppiert waren.

Um dies zu überprüfen, gehen Sie zu Ihrem AppDelegate, klicken Sie auf den Dateiinspektor und sehen Sie sich Target Membership an.

Verwandte Themen