繁体   English   中英

无法将“NSManagedObject”类型的返回表达式转换为“字符串”类型?

[英]Cannot convert return expression of type 'NSManagedObject' to return type 'String?'

我已经构建了一个应用程序(我的第一个),它可以像我想要的那样工作,但是我需要向它添加 CoreData 以保存/获取我的事件。 我可以看到我的事件(将信息添加到 tableview/从那里删除信息)在打印时被保存,并且应用程序在“viewDidAppear”中“加载”。 我认为的问题是我正在保存数组,而不是 NSobject。 或者我正在获取数组,而不是 NSobject? 我相信我需要做的是将我的数组添加到 NSManagedObject? 像这样:

变量列表:[MealsMenu] = []。 当我这样做时,我让它工作,太好了,但是,我有一个在 UIPickerView 中调用这个变量的 VC:并且只要我将列表添加到 NSManagedObject(MealsMenu,这是我在 coredatamodel 中的实体)我得到此错误消息:

无法将“NSManagedObject”类型的返回表达式转换为“字符串”类型?

我已经尝试用谷歌搜索了几天,但在我的情况下找不到任何解决方案。 你们中有人知道我能做什么吗?

我的实体(MealsMenu)有一个名为“meals”的属性,它指的是字符串。

正如我所说,如果我跳过 PickerView 所在的 VC,我可以让它工作。 正在保存已添加和已删除的事件。

这是我的代码:(所有显示“List[row]”或“List[indexPath.row]”的地方都会收到此错误消息)。

添加视图控制器:

import UIKit
import CoreData

class addViewController: UIViewController, UITextFieldDelegate {

var context = (UIApplication.shared.delegate as!     AppDelegate).persistentContainer.viewContext

@IBOutlet weak var input: UITextField!
@IBAction func addToMenu(_ sender: Any) {
   if input != nil{
            let newMeal = NSEntityDescription.insertNewObject(forEntityName: "MealsMenu",     into: context)
    newMeal.setValue(self.input.text, forKey: "meals")
            do {
                try context.save()
                print("SAVED")
            }
            catch{
                print(error)
            }
            input.text = ""
        }else{
            print("That's not a meal!")
        }
    }



override func viewDidLoad() {
    super.viewDidLoad()

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    input.resignFirstResponder()
    return true
}

}

表视图控制器:

import UIKit
import CoreData


class tableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return (List.count)

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->     UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    cell.textLabel?.text = List[indexPath.row]
    cell.textLabel?.textColor = UIColor.white
    cell.backgroundColor = UIColor.clear




    return(cell)

}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle,     forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete
    {
        List.remove(at: indexPath.row)
        myTableView.reloadData()
    }

}





@IBOutlet weak var myTableView: UITableView!

override func viewDidAppear(_ animated: Bool) {
    myTableView.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    coredataClass.saveItems()
    coredataClass.loadData()
}

}

视图控制器:

import UIKit
import CoreData

var List:[MealsMenu] = []


class ViewController: UIViewController {

@IBOutlet weak var monday: UITextField!
@IBOutlet weak var tuesday: UITextField!
@IBOutlet weak var wednesday: UITextField!
@IBOutlet weak var thursday: UITextField!
@IBOutlet weak var friday: UITextField!
@IBOutlet weak var saturday: UITextField!
@IBOutlet weak var sunday: UITextField!

var daysArray = [UITextField]()

let pickerView = ToolbarPickerView()

var selectedMenu : String?

override func viewDidLoad() {
    super.viewDidLoad()

    setupDelegateForPickerView()
    setupDelegatesForTextFields()
    coredataClass.loadData()
}




func setupDelegatesForTextFields() {
    //appending textfields in an array
    daysArray += [monday, tuesday, wednesday, thursday, friday, saturday, sunday]
    //using the array to set up the delegates, inputview for pickerview and also the     inputAccessoryView for the toolbar
    for day in daysArray {
        day.delegate = self
        day.inputView = pickerView
        day.inputAccessoryView = pickerView.toolbar
    }
}

func setupDelegateForPickerView() {
    pickerView.dataSource = self
    pickerView.delegate = self
    pickerView.toolbarDelegate = self
}
}

    // Create an extension for textfield delegate

extension ViewController : UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
    self.pickerView.reloadAllComponents()
}
}





// Extension for pickerview and toolbar

extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource {
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return List.count
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {

    return 1
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component:     Int) -> String? {

    return List[row]
}


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component:     Int) {

    // Check if the textfield isFirstResponder.
    if monday.isFirstResponder {
       monday.text = List[row]
    } else if tuesday.isFirstResponder {
        tuesday.text = List[row]
    } else if wednesday.isFirstResponder {
        wednesday.text = List[row]
    } else if thursday.isFirstResponder {
        thursday.text = List[row]
    } else if friday.isFirstResponder {
        friday.text = List[row]
    } else if saturday.isFirstResponder {
        saturday.text = List[row]
    } else if sunday.isFirstResponder {
        sunday.text = List[row]
   } else {
        //log errors
    }
}

}

extension ViewController: ToolbarPickerViewDelegate {

func didTapDone() {
    self.view.endEditing(true)
}

func didTapCancel() {
    self.view.endEditing(true)
 }
}

“ViewController”中的特定这些函数/行正在引发这些错误:无法将“MealsMenu”类型的返回表达式转换为“String”类型的返回表达式?

 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    return List[row]
}


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    // Check if the textfield isFirstResponder.
    if monday.isFirstResponder {
       monday.text = List[row]
    } else if tuesday.isFirstResponder {
        tuesday.text = List[row]
    } else if wednesday.isFirstResponder {
        wednesday.text = List[row]
    } else if thursday.isFirstResponder {
        thursday.text = List[row]
    } else if friday.isFirstResponder {
        friday.text = List[row]
    } else if saturday.isFirstResponder {
        saturday.text = List[row]
    } else if sunday.isFirstResponder {
        sunday.text = List[row]
   } else {
        //log errors
    }
}

在“tableViewController”中,这个 function 引发了类似的错误:无法将“MealsMenu”类型的值分配给“String?”

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    cell.textLabel?.text = List[indexPath.row]
    cell.textLabel?.textColor = UIColor.white
    cell.backgroundColor = UIColor.clear

非常感谢任何指导和帮助!

/ 安德烈亚斯

请仔细阅读错误信息,然后看看你的设计

您的数据源是MealsMenu实例数组,它是NSManagedObject的子类,而返回值是String? .

这就是错误消息所说的内容:您无法返回预期字符串的MealsMenu实例

return List[row].meals

数据源声明行有两个不好的做法。

  1. 变量名应该小写。
  2. 数组的变量名应该以复数形式命名。

后者将清楚地表明该变量包含多个项目,例如

var menus : [MealsMenu] = []

通过这种变化并将线分成两部分,错误变得更加明显

let menu = menus[row]
return menu.meals

顺便说一下, meals的命名也令人困惑,因为它意味着是一个数组。


cellForRow中相应地更改行

let menu = menus[indexPath.row]
cell.textLabel?.text = menu.meals

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM