У меня проблема, мое приложение рушится во время segue в моем TableViewController
import UIKit
import MapKit
import CoreLocation
class CourseClass: UITableViewController, CLLocationManagerDelegate, MKMapViewDelegate {
@IBOutlet weak var map: MKMapView!
struct User {
var name: String
var images: UIImage
var coordinate: (Double, Double)
var type: String
}
/* var place = ["Caffè Spagar", "Duks", "Posta station", "Barnum", "Elephant Club", "Cinema", "Space", "Andromeda", "Rodolf", "Devil Chair"] */
var rows = 0
var users = [User]()
let CS = User(name: "Caffè Spagar", images: UIImage(named: "Caffè Spagar.png")! , coordinate:(12345,54678), type: "Pub")
let D = User(name: "Duks", images: UIImage(named: "Duks.png")! , coordinate:(13345,54128), type: "Shopping")
let PS = User(name: "Posta station", images: UIImage(named: "Posta station.png")! , coordinate:(18795,34556), type: "Resturant")
let B = User(name: "Barnum", images: UIImage(named: "Barnum.png")! , coordinate:(46655,43554), type: "Pub")
let EC = User(name: "Elephant Club", images: UIImage(named: "Elephant Club.png")! , coordinate:(12325,21435), type: "Disco")
let C = User(name: "Cinema", images: UIImage(named: "Cinema.png")! , coordinate:(11235,12343), type: "Cinema")
let S = User(name: "Space", images: UIImage(named: "Space.png")! , coordinate:(12345,66432), type: "Cinema")
let A = User(name: "Andromeda", images: UIImage(named: "Andromeda.png")! , coordinate:(64545,23443), type: "Sport")
let R = User(name: "Rodolf", images: UIImage(named: "Rodolf.png")! , coordinate:(64545,34358), type: "Shopping")
let DC = User(name: "Devil Chair", images: UIImage(named: "Devil Chair.png")! , coordinate:(56656,54678), type: "Shopping")
override func viewDidLoad() {
super.viewDidLoad()
map.showsUserLocation = true
map.delegate = self
users.append(CS)
users.append(D)
users.append(PS)
users.append(B)
users.append(EC)
users.append(C)
users.append(S)
users.append(A)
users.append(R)
users.append(DC)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
insertRowsMode3()
}
func insertRowsMode2() {
for i in 0..<users.count {
insertRowMode2(ind: i, usr: users[i])
}
}
func insertRowMode2(ind:Int,usr:User) {
let indPath = IndexPath(row: ind, section: 0)
rows = ind + 1
tableView.insertRows(at: [indPath], with: .right)
}
func insertRowsMode3() {
rows = 0
insertRowMode3(ind: 0)
}
func insertRowMode3(ind:Int) {
let indPath = IndexPath(row: ind, section: 0)
rows = ind + 1
tableView.insertRows(at: [indPath], with: .right)
guard ind < users.count-1 else { return }
DispatchQueue.main.asyncAfter(deadline: .now()+0.15) {
self.insertRowMode3(ind: ind+1)
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rows
}
public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
let user = users[indexPath.row]
cell.myImage.image = user.images
cell.myLabel.text = user.name
cell.myTypeLabel.text = user.type
/* cell.myImage.image = UIImage(named: (place[indexPath.row] + ".png"))
cell.myLabel.text = place[indexPath.row]
*/
return (cell)
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "goToLast" , sender: users[indexPath.row])
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
@IBAction func mapTapped(_ sender: Any) {
let userLocation = map.userLocation
let region = MKCoordinateRegionMakeWithDistance((userLocation.location?.coordinate)!,2000,2000)
map.setRegion(region, animated: true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToLast" {
guard let vc = segue.destination as? FinalClass else { return }
let guest = segue.destination as! FinalClass
guest.local = sender as! String
guest.localImage = UIImage(named: (sender as! String) + ".png")!
guest.localType = sender as! String
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
именно в этой функции
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToLast" {
guard let vc = segue.destination as? FinalClass else { return }
let guest = segue.destination as! FinalClass
guest.local = sender as! String
guest.localImage = UIImage(named: (sender as! String) + ".png")!
guest.localType = sender as! String
}
}
И проблема
Не удалось передать значение типа "Myapp.CourseClass.User" в "Swift.String".
Кроме того, перед тем как испытать эту проблему, приложение рушилось, когда я увольняю следующую сцену, чтобы вернуться сюда. Кто-то знает, как я могу настроить свой код, чтобы он работал?
guest.local = sender as! String
guest.localImage = UIImage(named: (sender as! String) + ".png")!
guest.localType = sender as! String
проблема, кажется, здесь, попробуйте получить тип "отправителя" как его "Любой", и я предполагаю, что это тип пользователя, который является причиной сбоя
Не удалось передать значение типа "Myapp.CourseClass.User" в "Swift.String"
что означает, что вы принудительно бросаете объект типа пользователя в String.
который может быть исправлен как ответ khalid как
if let user = sender as? User {
guest.local = user.local
guest.localImage = user.image
guest.localType = user.localType
}
Еще один чистый отладочный подход для поиска точной причины сбоя может быть:
перейдите в навигатор BreakPoint Navigator на вкладке Navigator слева от Xcode.
создайте точку останова для всех исключений, как описано в следующем изображении, которое остановит ваш код на точной строке сбоя при запуске приложения с отладкой вкл.
Вы отправляете пользовательский класс и затем отбрасываете класс пользователя в строку
Попробуй это
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToLast" {
guard let vc = segue.destination as? FinalClass else { return }
let guest = segue.destination as! FinalClass
if let user = sender as? User {
guest.local = user.local
guest.localImage = user.image
guest.localType = user.localType
}
}
}