Передача данных из контроллера просмотра для просмотра в MVC - Swift - PullRequest
0 голосов
/ 27 апреля 2019

Передача данных между UIViewControllers довольно проста, но передача данных из контроллера в представление - это то, чего я не могу понять.

В моем конкретном случае пользователь нажимает на событие "ячейка, и переходы в подробный вид.

Как передать «событие» из повернутой ячейки в подробный вид?

// Inside Starting View Controller
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let vc = EventDetailController()
    let vcView = vc.view as! EventDetailView
    vcView.event = model.events[indexPath.item]
    navigationController?.pushViewController(vc, animated: true)
}



// Second View
class EventDetailView: UIView {

    var event: Event?     
    let model = EventsModel()

    override init(frame: CGRect) {
        super.init(frame: frame)
        print("selected event: \(event)") <<<<--- Prints "nil"
    }

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


// Second Controller
class EventDetailController: UIViewController {

    var eventDetailView: EventDetailView!

    override func loadView() {
        super.loadView()
        view = eventDetailView
    }

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019
// First View Controller

let vc = EventDetailController()
vc.eventDetailView.event = "TEST"
navigationController?.pushViewController(vc, animated: true)


// Second View
class EventDetailView: UIView {

    var event: String?
    var model =  EventsModel()

    override init(frame: CGRect) {
        super.init(frame: frame)
        print("selected event: \(event)")
    }

    override func encode(with aCoder: NSCoder) {
        super.encode(with: aCoder)
        aCoder.encode(event as Any?, forKey: "event")
        aCoder.encode(model as Any?, forKey: "model")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        event = aDecoder.decodeObject(forKey: "event") as? String? ?? ""
        model = aDecoder.decodeObject(forKey: "model") as! EventsModel? ?? EventsModel()
    }
}

// Second Controller
class EventDetailController: UIViewController {

    var eventDetailView = EventDetailView()

    override func loadView() {
        super.loadView()
        view = eventDetailView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print(eventDetailView.event)
    }
}
0 голосов
/ 27 апреля 2019

Вы передаете данные, которые не являются правильным способом сделать это. Вы никогда не должны получать доступ к представлению, пока оно не было показано или загружено правильно.

В вашем class EventDetailController добавьте свойство

var event: Event?     

и замените этот метод, как показано ниже

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let vc = EventDetailController()
    vc.event = model.events[indexPath.item]
    navigationController?.pushViewController(vc, animated: true)
}

и

override func viewDidLoad() {
   super.viewDidLoad()
   eventDetailView.event = self.event   
}  

Надеюсь, это поможет

EDIT

В методе просмотра нагрузки добавьте следующую строку в начале метода

 `eventDetailView = EventDetailView(frame:CGRect(x:0,y:0,width:UIScreen.main.bounds.width,height:UIScreen.main.bounds.height))`     
...