Ios ViewController没有名为managedObjectContext的成员
我试图在popoverpresentationviewcontroller中使用coredata,但它一直说我的名为PopoverVC的视图控制器没有名为managedObjectContext的成员 我试过: 1。正在初始化PopoverViewController的内部初始化:Ios ViewController没有名为managedObjectContext的成员,ios,swift,core-data,Ios,Swift,Core Data,我试图在popoverpresentationviewcontroller中使用coredata,但它一直说我的名为PopoverVC的视图控制器没有名为managedObjectContext的成员 我试过: 1。正在初始化PopoverViewController的内部初始化: required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.appDelegate = (UIApplicat
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.appDelegate = (UIApplication.sharedApplication().delegate) as! AppDelegate
self.managedObjectContext = appDelegate.managedObjectContext!
}
2。从另一个视图控制器传递它,我只是通过调用App Delegate获得它
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
switch(segue.identifier!) {
case "popOverSegue":
let controller = segue.destinationViewController as! PopoverVC
controller.managedObjectContext = self.managedObjectContext!
break
default:
break
}
}
通常,我可以通过使用以下命令在任何其他视图控制器中访问它:
((UIApplication.sharedApplication().delegate) as! AppDelegate).managedObjectContext
我听说这可能是个糟糕的做法,但这在这个popover视图控制器中根本不起作用。其他stackoverflow问题的解决方案也都不起作用
编辑,下面是我的PopoverViewController类的外观,包括所有这些,以确保它不是破坏代码的愚蠢语法错误。我现在将managedObjectContext声明为getter属性。还是一样的错误
class PopoverViewController: UIViewController, UIPopoverPresentationControllerDelegate, UIPickerViewDelegate {
@IBOutlet weak var testingLabel: UILabel!
@IBOutlet weak var aPicker: UIPickerView!
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//cancel button
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: "tapCancel:")
// popover settings
modalPresentationStyle = .Popover
popoverPresentationController!.delegate = self
self.preferredContentSize = CGSize(width:400,height:600)
}
//var appDelegate: AppDelegate
//var managedObjectContext:NSManagedObject
var appDelegate: AppDelegate {
return UIApplication.sharedApplication().delegate as! AppDelegate
}
var managedObjectContext: NSManagedObjectContext {
return self.appDelegate.managedObjectContext!
}
var pickerData = ["Mozzarella","Gorgonzola","Provolone","Brie","Maytag Blue","Sharp Cheddar","Monterrey Jack","Stilton","Gouda","Goat Cheese", "Asiago"]
let fetchRequest = NSFetchRequest(entityName: "Region")
var fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as [Region]
//pickerData = fetchResults
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
return 2
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return pickerData.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!{
//return pickerData[row]
}
@IBInspectable var popoverOniPhone:Bool = false
@IBInspectable var popoverOniPhoneLandscape:Bool = true
func adaptivePresentationStyleForPresentationController(PC: UIPresentationController) -> UIModalPresentationStyle{
//this methods is only called by System when the screen has compact width
//return .None means we still want popover when adaptive on iPhone
//return .FullScreen means we'll get modal presetaion on iPhone
switch(popoverOniPhone, popoverOniPhoneLandscape){
case (true, _): // always popover on iPhone
return .None
case (_, true): // popover only on landscape on iPhone
let size = PC.presentingViewController.view.frame.size
if(size.width>320.0){ //landscape
return .None
}else{
return .FullScreen
}
default: // no popover on iPhone
return .FullScreen
}
}
func presentationController(_: UIPresentationController, viewControllerForAdaptivePresentationStyle _: UIModalPresentationStyle)
-> UIViewController?{
return UINavigationController(rootViewController: self)
}
func tapCancel(_ : UIBarButtonItem) {
//tap cancel
dismissViewControllerAnimated(true, completion:nil);
}
}您已将
managedObjectContext
声明为只读计算属性,因此无法为其赋值
要使用prepareforsgue
中的赋值,需要将其设置为直接可选属性-
var managedObjectContext: NSManagedObjectContext?
您是否声明了属性变量
managedObjectContext
?@Paulw11是的。使用行:managedObjectContext:NSManagedObject?我想它肯定可以声明一个属性,但如果它没有初始化,在运行时就会崩溃,或者在编译未初始化的属性之前给出一个错误。但它始终坚持类“没有名为managedObjectContext的成员”请编辑您的问题以显示PopoverViewController
的类定义,包括此属性定义,因为编译器说你没有it@Paulw11现在编辑该问题以包括类定义和属性定义。这一定是一个愚蠢的错误,因为编译器不应该给出错误,除非它找不到它。这是在PopoverViewController类中声明的,与上面的完全一样,同一个类似乎找不到它。“'PopoverViewcontroller.Type'没有名为managedObjectContext的成员”我已将您的类复制到操场中,并且可以引用self.managedObjectContext
。fetchResults
将出现问题,因为它将在有值之前尝试使用managedObjectContext