次の問題を解決するために半日過ごしました。私はSwift言語を使用してCoreDataをテストしています。 this チュートリアルに従ってくださいすべてが正常に動作します。
しかし、チュートリアルの後、私は structure と私のコードを変更しようとしました。 「src」とその中のグループはフォルダであり、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?)
}
}
私はこの問題をさまざまな方法で解決しようとしました:1)新しいプロジェクト(Swiftメイン言語)を作成し、同じ構造を再度作成します(失敗)2)新しいプロジェクト(Objective-Cメイン言語)を作成します。したがって、AppDelegate.hとAppDelegate.mがあります。 Swift Bridging-Headerを使用してファイルに追加します。同じ問題が発生します(失敗))
次は本当に面白い。新しいプロジェクトで自動的に作成されるViewController.Swiftに次のコードを追加すると、すべてが正常に機能します。しかし、このコードを他のクラスに配置すると、このエラーをコーディングしました。
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
}
}()
[更新1]
NSSAppDelegate.Swiftと同じフォルダーに別のクラスを作成しようとしましたが、すべて正常に機能します。それでも問題はありますが、他のフォルダに保存されているクラスをどのように使用できますか?
[更新2]
他のプロジェクトで同じことをやろうとしただけです。ファイル構造が this の場合、AppDelegate.SwiftとNGDataManager.Swiftは同じフォルダーにあり、すべてがうまく機能します。しかし、NGDataManager.Swiftを this (グループ、フォルダーだけでなく)のように 'src'フォルダー内に配置すると、 error が発生します。これについて他の質問を作成する必要があるかもしれません。
[更新3]
方法はわかりませんが、私がUDATE 2で言ったことはすべて忘れることができます。 「Test」という名前のCoreDataで新しいプロジェクトを作成し、「TestClass」という名前の新しいクラスを作成するだけです。魔法は次のことです:このコードをTestClass.Swift内に配置した場合
import UIKit
class TestClass: NSObject {
func someFunc() {
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
エラーが発生します。しかし、このコードを、xCodeによって自動的に生成されたViewController.SwiftのviewDidLoadに配置すると
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
エラーはなく、すべてが正常に動作します。なんて言ったらいいのかわからない….
AppDelegateコード here が表示される場合がありますが、xCodeによって自動的に生成されたものは変更していません。 this 設定のシングルビューアプリケーションを作成しました。
プロジェクトを作成したときに、 '{ProjectName} Tests'ターゲットも作成した可能性があります。問題は、AppDelegateに '{ProjectName} Tests'ターゲットのメンバーシップが割り当てられていないことです。
AppDelegate.Swiftを選択し、右側のインスペクターで[ファイルインスペクター](紙のアイコン)をクリックして、[ターゲットメンバーシップ]でプロジェクトとテストターゲットのチェックマークが両方ともオンになっていることを確認します。
クリーン、リビルド。
SwiftコードでObjective-C AppDelegateにアクセスする場合は、#import "AppDelegate.h"
をブリッジヘッダーファイルに追加します。
これは私が約1時間スタックしていた:-/
製品メニューで「クリーン」オプションを実行したときに解決された同様の問題がありました
Xcode 8でこの問題に遭遇し、これが私がgoogleで検索したときの最初の結果なので、私のソリューションを追加しました。
プロジェクトにUIと単体テストがある場合は、AppDelegateが両方のターゲットメンバーシップに追加されていることを確認してください。テストに追加すると、ファイルのグループ化方法に関係なく、UIApplication.shared
を使用しなくても、AppDelegateにあるすべての変数にアクセスできました。
確認するには、AppDelegateに移動し、ファイルインスペクタをクリックして、Target Membership
を確認します。
こうなると思います。
let appDelegate: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
ターゲットメンバーシップが各ファイルで同じに設定されていることを確認します。特定のファイルをクリックすると、ターゲットメンバーシップがプロパティインスペクターに表示されます。
の代わりに:
let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate
試してください:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate