При использовании 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"