iOS-новый стиль контактов в Swift - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь эмулировать контакты 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) есть ли лучший способ сделать это?

Большое спасибо за любую помощь, предложения и т. Д.

1 Ответ

0 голосов
/ 30 мая 2018

(1) Я не слишком рад принуждению downcast к UINavigationController, поскольку я ожидал, что self.presentingViewController будет иметь тип PeopleViewController?

Нет ничего плохого в даункинге,Я бы определенно удалил принудительное развертывание.

(2), есть ли утечка памяти в закрытии, так как я использовал слабый var pvc = self.presentingViewController для pvc, но не для cvc?

Я думаю, нет ни одного.

(3) есть ли лучший способ сделать это?

Вы можете представить недавно добавленный контакт изNewContactVC.Когда вы собираетесь уволить, позвоните уволить на презентации ВК.

// NewPersonViewController.swift
func addNewPerson() {
// New person is added
// Show PeopleViewController modally
}

Примечание. При использовании presentingViewController таким образом будут отклонены два верхних / один модальных (ей) .Вы увидите только отклонение контроллера вида сверху.Если вы не можете определить, сколько будет модалов, вам следует поискать другое решение или, возможно, изменить дизайн навигационного потока.

// PeopleViewController.swift
func dismiss() {
    if let presentingVC = self.presentingViewController?.presentingViewController {
       presentingVC.dismiss(animated: true, completion: nil)
    } else {
       self.dismiss(animated: true, completion: nil)
    }
}
...