无法将类型 'NSManagedObject' 的返回表达式转换为返回类型 'String?'



我已经构建了一个应用程序(我的第一个(,它按照我想要的方式工作,但随后我需要向其中添加CoreData以保存/获取我的事件。我可以看到我的事件(向表视图添加信息/从中删除信息(在打印时被保存,并且应用程序在"viewDidPappear"中"已加载"。我认为问题在于我保存的是数组,而不是NSobject。或者我正在获取数组,而不是NSobject?我相信我需要做的是将我的阵列添加到NSManagedObject?像这样:

var List:[MeelsMenu]=[]。当我这样做的时候,我就开始工作了!太棒了!但是,我有一个VC正在UIPickerView中调用这个变量,当我将列表添加到NSManagedObject(MealsMenu,它是我在coredatamodel中的实体(时,我收到了以下错误消息:

无法将"NSManagedObject"类型的返回表达式转换为返回类型"String?">

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

我的实体(MealsMenu(有一个名为"meas"的属性,它指的是字符串。

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

这是我的代码:(所有上面写着"List[row]"或"List[indexPath.row]"的地方我都收到了这个错误消息(。

addViewController:

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

tableViewController:

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

ViewController:

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"中,此函数抛出了一个类似的错误:无法将"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

非常感谢您的指导和帮助!

/Andreas

请仔细阅读错误消息,然后查看您的设计

您的数据源是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

最新更新