swift _ Нажатие ViewController дает черный экран

введите описание изображения здесь

У меня есть два экрана: первый ViewController имеет tableview, а второй MapViewController один содержит MKMapView, когда я перехожу с первого на второй, второй выглядит как черный экран, второй экран должен появиться, карта яблока может мне помочь?

 import UIKit
import  MapKit
struct Category {
    let place : String
    let coordinates  : [Double]
}
class ViewController: UIViewController {
    
    private let tableview : UITableView={
        let table = UITableView()
        table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        return table
        
    }()
    private let data : [Category]=[
    Category(place: "Misr bank ", coordinates: [30.576352,31.503955])

    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableview)
        tableview.delegate=self
        tableview.dataSource=self
    }
    
    override func viewDidLayoutSubviews() {
        tableview.frame=view.bounds
    }


}

extension ViewController:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let category = data[indexPath.row]
        let mapview = MapViewController(coor: category.coordinates)
        self.navigationController?.pushViewController(mapview, animated: true)
    }
}

MapViewController

    import UIKit
import MapKit
class MapViewController: UIViewController {

    
    @IBOutlet weak var map: MKMapView!
    private let coor : [Double]
    
    init(coor:[Double]){
        self.coor=coor
        super.init(nibName: nil, bundle: nil)
        
        let lat = coor[0]
        let long = coor[1]
        print(lat)
        print(long)

    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

person eng mahmoud arafat    schedule 24.01.2021    source источник
comment
Просто чтобы вы поняли, почему я проголосовал за закрытие - вам практически невозможно помочь без более подробной информации. С верхней части моей головы? Вы используете IB, а IBOutlets настроены неправильно? Как вы путешествуете? У вас есть какая-то опечатка? Обратите внимание, что я не голосовал против. Но как вы можете ожидать, что кто-то поможет вам, если вы не предоставите нам достаточно подробностей, чтобы понять, в чем проблема? Может быть, если кто-то сможет продублировать вещи, они смогут помочь.   -  person dfd    schedule 24.01.2021
comment
Пожалуйста, загрузите код и дополнительную информацию. Возможно, скриншот вашей раскадровки, если вы ее используете.   -  person Luca Sfragara    schedule 25.01.2021
comment
извините, я добавил два изображения для ViewController и MapViewController   -  person eng mahmoud arafat    schedule 26.01.2021
comment
Не показывайте картинки кода. Показать код.   -  person matt    schedule 26.01.2021
comment
хорошо, я добавил свой код   -  person eng mahmoud arafat    schedule 26.01.2021


Ответы (1)


Похоже, MapViewController разработан в раскадровке. (Если бы не было, вы бы не говорили о @IBOutlet weak var map: MKMapView!)

Но если это так, то выражение MapViewController(coor: category.coordinates) - это не способ получить экземпляр, созданный вами в раскадровке. Если вы так скажете, вы действительно получите пустой интерфейс.

Вместо этого дайте этому экземпляру в раскадровке идентификатор, а в своем коде попросите раскадровку создать экземпляр контроллера представления, имеющего этот идентификатор.

Вам также придется полностью изменить вашу инициализацию. Раскадровка будет вызывать init(coder:), а не init(coor:). Фактически, вы можете полностью избавиться от последнего:

@IBOutlet weak var map: MKMapView!
var coor = [Double]()
required init?(coder: NSCoder) {
    super.init(coder:coder)
}
override func viewDidLoad() {
    super.viewDidLoad()
    let lat = coor[0]
    let long = coor[1]
    print(lat)
    print(long)
}

Теперь, когда вы создаете экземпляр MapViewController из раскадровки, сразу же установите mapView.coor перед нажатием.

person matt    schedule 25.01.2021
comment
И см. Мой programmingios.net/dont-make- a-new-instance-by-error-2 - person matt; 26.01.2021
comment
Я создал в раскадровке идентификатор идентификатора и попросил раскадровку создать экземпляр контроллера представления с этим идентификатором. Я добавил этот код let storyboard = UIStoryboard (name: Main, bundle: nil) let mapCV = storyboard.instantiateViewController (withIdentifier: Map) as! MapViewController присутствует (mapCV, анимированный: true, завершение: nil). но появившаяся ошибка init (coder :) не реализована - person eng mahmoud arafat; 26.01.2021
comment
Да, я понимаю почему. Вам нужно это реализовать. - person matt; 26.01.2021
comment
вы можете мне больше помочь, как это реализовать? - person eng mahmoud arafat; 26.01.2021
comment
Добавлена ​​дополнительная информация, надеюсь, это поможет. - person matt; 26.01.2021
comment
спасибо проблема решена как ты сказал - person eng mahmoud arafat; 26.01.2021
comment
Отлично, рад помочь. Было очень приятно с вашей стороны принять мой ответ еще до того, как мы пришли к окончательному решению. - person matt; 26.01.2021