Не удается преобразовать возвращаемое выражение типа «NSManagedObject» в возвращаемый тип «String?» - PullRequest
0 голосов
/ 03 мая 2020

Я создал приложение (мое первое), и оно работает так, как я хочу, но затем мне нужно было добавить в него CoreData для сохранения / извлечения моих событий. Я вижу, что мои события (добавление информации в табличное представление / удаление информации оттуда) сохраняются при печати, и приложение «загружается» в «viewDidAppear». Проблема в том, что я сохраняю массив, а не NSobject. ИЛИ Я получаю массив, а не NSobject? Я считаю, что мне нужно сделать, чтобы добавить свой массив в NSManagedObject? Например:

var List: [MealsMenu] = []. Когда я делаю это, я заставляю его работать! Замечательно! НО, у меня есть V C, который вызывает эту переменную в UIPickerView, и как только я добавляю список в NSManagedObject (MealsMenu, который является моей сущностью в coredatamodel), я получаю это сообщение об ошибке:

Невозможно преобразовать возвращаемое выражение типа 'NSManagedObject' в возвращаемое значение 'String?'

Я пытался Google это несколько дней, но не могу найти никакого решения для этого в моем случае. Кто-нибудь из вас имеет представление о том, что я могу сделать?

У моей сущности (MealsMenu) есть атрибут «питание», который относится к строке.

Как я уже сказал, если я пропущу V C, где находится PickerView, я получу его на работу! Добавленные и удаленные события сохраняются.

Вот мой код: (Все места, где написано «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)
 }
}

Specifi c эти функции / строки в "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

1 Ответ

0 голосов
/ 03 мая 2020

Пожалуйста, внимательно прочитайте сообщение об ошибке, а затем посмотрите на ваш дизайн

Ваш источник данных - это массив 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...