2014-11-19 13 views
9

Ho appena passato mezza giornata a cercare di risolvere il problema successivo. Sto testando il CoreData usando il linguaggio Swift. Segui il tutorial this, tutto funziona correttamente.Uso del tipo non dichiarato 'AppDelegate' Swift

Ma dopo titorial ho provato a modificare il structure e il mio codice. "Src" e i gruppi al suo interno sono cartelle, non solo gruppi creati da 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?) 
    } 

} 

ho cercato di risolvere questo problema modi diversi: 1) Creare nuovo progetto (Swift lingua principale) e fare lo stesso struttura di nuovo (non riuscita) 2) Creare un nuovo progetto (linguaggio principale Objective-C). Quindi ho AppDelegate.h e AppDelegate.m. Aggiungilo ai file Swift usando Bridging-Header. Lo stesso problema. (fallito)

Davvero interessante la prossima cosa. Se metto il prossimo codice su ViewController.swift che crea automaticamente con il nuovo progetto, tutto funziona correttamente. Ma quando inserisco questo codice in un'altra classe. Ho codificato questo errore.

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]

Ho cercato di creare un altro diritto classe alla stessa cartella NSSAppDelegate.swift e ora tutto funziona bene. Tuttavia è ancora un problema, come posso usare le classi che sono archiviate in altre cartelle?


[UPDATE 2]

solo cercato di fare la stessa cosa in un altro progetto. Se la struttura del file è come this, così AppDelegate.swift e NGDataManager.swift si trovano nella stessa cartella, tutto funziona alla grande. MA, se inserisco NGDataManager.swift all'interno della cartella 'src' come this (non solo gruppo, cartella) si verifica error. Forse dovrei creare l'altra domanda per questo.


[UPDATE 3]

Non so come, ma si può dimenticare tutto quello che ho detto nel UDATE 2. Perché ora questo è tutto non funziona. Creo persino un nuovo progetto con CoreData denominato "Test" e creo solo una nuova classe chiamata "TestClass". La magia è nella prossima cosa: se ho messo questo codice all'interno del TestClass.swift

import UIKit 

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

si verifica l'errore. Ma se metto questa linea in viewDidLoad in ViewController.swift che è stata generata automaticamente dal xCode

import UIKit 

class ViewController: UIViewController { 

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

loro è alcun errore e tutto funziona alla grande. Non so cosa dire ...

Potresti vedere il codice AppDelegate here ma non ho modificato nulla generato automaticamente da xCode. Ho creato un'applicazione di visualizzazione singola con le impostazioni this.

+0

'NSSAppDelegate' - che cosa dovrebbe essere? Sicuramente è 'NSApplicationDelegate'? – Grimxn

+0

Non dovresti avere come prefisso le tue classi con 'NS', in futuro ti imbatterai in tutti i tipi di problemi. – sbarow

+0

@sbarow questo è il prefisso della mia azienda NSS. Ma certo che hai ragione, creerà l'altro prefisso. Tuttavia, ho provato a utilizzare AppDelegate, senza il prefisso, solo per mostrare l'ultima versione del codice qui. – Doshipak

risposta

0

Invece di:

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

prova:

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

Ho provato prima. Lo stesso problema. Vedi l'aggiornamento della domanda. – Doshipak

46

Le probabilità sono al momento della creazione del progetto è inoltre stato creato un '{} Nome progetto Test' di destinazione. Il problema è che AppDelegate non viene assegnato all'appartenenza alla destinazione '{ProjectName} Tests'.

Selezionare AppDelegate.swift quindi, nell'ispettore a destra, fare clic su File Inspector (l'icona di carta) quindi assicurarsi che in "Appartenenza di destinazione" sia il progetto sia i segni di verifica del target di test siano impostati su ON.

Pulire, ricostruire.

+0

@Tieme Non è funzionato per me ( penso che la ragione principale è perché ho creato la classe in un'altra cartella, non nella stessa cartella del file AppDelegate.swift Ho struttura prossimo:. MyProjFolder: { AppDelegate .swift srcFolder: { SomeClass.swift}} SomeClass.swift non può vedere AppDelegate nel suo ambito. – Doshipak

+0

Questo non dovrebbe importare – Tieme

+0

@Tieme ma lo è. L'ho provato più volte in diversi progetti, e se metto la classe nell'altra cartella, questa classe non può vedere AppDelegate. – Doshipak

3

ho avuto un problema simile che è stato risolto quando ho fatto un opzione "Clean" nel menu del prodotto

2

Assicurarsi che le appartenenze di destinazione vengono impostate la stessa in ogni file. Le iscrizioni di destinazione possono essere trovate nella finestra di ispezione Proprietà quando si fa clic su un file specifico.

2

Supponiamo di essere così.

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

Se si cerca di accedere a un Objective-C AppDelegate nel codice Swift, assicurarsi di avere #import "AppDelegate.h" nel file di intestazione colmare.

Questo mi aveva bloccato per circa un'ora: -/

+0

Grazie, ho salvato la mia ora –

0

imbattuto in questo problema in Xcode 8 e questo è stato il primo risultato quando ho cercato su google in modo da aggiungere la mia soluzione.

Se il progetto ha UI e Test unità, assicurarsi che AppDelegate sia aggiunto a entrambe le appartenenze di destinazione. Una volta che l'ho aggiunto ai miei test, sono stato in grado di accedere a qualsiasi variabile presente nel mio AppDelegate senza dover utilizzare UIApplication.shared indipendentemente da come i miei file sono stati raggruppati.

Per controllare, andare su AppDelegate, fare clic sull'ispettore file e cercare Target Membership.

Problemi correlati