Я пытаюсь эмулировать контакты iOS между двумя контроллерами представления.
У меня есть простой Person
класс, заданный:
class Person {
var name = ""
}
и UIViewController
, который содержитмассив Person
, который встроен в UINavigationController
:
class PeopleViewController: UIViewController {
var people = [Person]()
var selectedPerson: Person?
switch segueIdentifier(for: segue) {
case .showPerson:
guard let vc = segue.destination as? PersonViewController else { fatalError("!") }
vc.person = selectedPerson
}
}
Этот контроллер использует Show segue to PersonViewController
для отображения selectedPerson
:
class PersonViewController: UIViewController {
var person: Person!
}
PeopleViewController
также может добавить новый Person
в массив Person
.NewPersonViewController
представлен модально , однако:
class NewPersonViewController: UIViewController {
var person: Person?
}
Если добавлен новый Person
, я хочу NewPersonViewController
отклонить, но показать новый Person
в PersonViewController
, который является частью стека навигации.Моя лучшая догадка для этого:
extension NewPersonViewController {
func addNewPerson() {
weak var pvc = self.presentingViewController as! UINavigationController
if let cvc = pvc?.childViewControllers.first as? PeopleViewController {
self.dismiss(animated: false, completion: {
cvc.selectedPerson = self.person
cvc.performSegue(withIdentifier: .showPerson, sender: nil)
}
}
}
}
Тем не менее, (1) Я не слишком доволен снижением рейтинга до UINavigationController
, как я ожидал self.presentingViewController
быть типа PeopleViewController
?И (2) , есть ли утечка памяти в замыкании, когда я использовал weak var pvc = self.presentingViewController
для pvc
, но не для cvc
?Или, наконец, (3) есть ли лучший способ сделать это?
Большое спасибо за любую помощь, предложения и т. Д.