при попытке передать данные между двумя контроллерами, я получаю сообщение об ошибке не может присвоить значение типа 'ViewController.Item?'набрать «Item?», - PullRequest
0 голосов
/ 06 октября 2019

При использовании segue я пытаюсь передать информацию другому контроллеру, используя

(взято из ViewController)

var itemArray: [Item] = []

на втором контроллере представления (InfoViewController) У меня есть

var item: Item?

Это мой ход

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "showDetail" {
        let InfoController = segue.destination as! InfoViewController
        InfoController.item = sender as? Item

Почему я получаю сообщение об ошибке, когда item и itemArray находятся в классе Item. Как сделать так, чтобы они оба имели одинаковый тип данных для передачи данных в InfoViewController

Полный код для InfoViewController:

class InfoViewController: UIViewController {

var item: Item?


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

}

открытый класс Item{let name: String let image: String

init(name: String, image: String) {
    self.name = name
    self.image = image

}

}

ViewController слишком длинный (150 строк, поэтому я опустил функцию поиска и код области поиска.

  @IBOutlet var tableView: UITableView!
@IBOutlet var searchBar: UISearchBar!

var itemArray: [Item] = []
var currentItemArray: [Item] = []


override func viewDidLoad() {
    super.viewDidLoad()
    setUpItems()
    setUpSearchBar()
    self.searchBar.showsScopeBar = true
    searchBar.placeholder = "Search Item by Name"

}

private func setUpItems() {
    itemArray.append(Item(name: "Plastic Bottles", category: .Plastic, image: "1"))
    itemArray.append(Item(name: "Cans", category: .Metal, image: "2"))

    currentItemArray = itemArray

}

private func setUpSearchBar() {
    searchBar.delegate = self

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return currentItemArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? TableViewCell
    else {
        return UITableViewCell()
    }

    cell.nameLabel.text = currentItemArray[indexPath.row].name
    cell.imgView.image = UIImage(named:currentItemArray[indexPath.row].image)

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "showDetail" {
        let InfoController = segue.destination as! InfoViewController
        InfoController.item = sender as? Item
    }

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item = itemArray[indexPath.row]
    performSegue(withIdentifier: "showDetail", sender: item)
}

public class Item {
let name: String
let image: String
let category: ItemType

init(name: String, category: ItemType, image: String) {
    self.name = name
    self.image = image
    self.category = category
}

}

enum ItemType: String {
    case Plastic = "Plastic"
    case Metal = "Metal"
    case Paper = "Paper"

1 Ответ

0 голосов
/ 06 октября 2019

Убедитесь, что вы не объявили тип Item в качестве члена контроллера представления.

Объявите структуру или класс Item глобально в вашем проекте.

...