Выполнение Segue изнутри View - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть пользовательский класс с именем MenuBar, который UIView используется для представления UICollectionView контроллеру представления.У меня проблема с использованием перехода к другому контроллеру представления, когда выбран UICollectionViewCell.Поскольку MenuBar не является контроллером представления, я не могу назвать performSegue().Я создал переход в моей раскадровке между двумя контроллерами представления с идентификатором.Как я могу правильно запустить переход из моего пользовательского класса просмотра?Как это обычно делается?Я попытался создать новый экземпляр моего контроллера представления, чтобы я мог использовать .performSegue() из функции didSelectItemAt collectionView, но я не думаю, что это вообще правильный способ сделать это.пример:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let vc = UARTModuleViewController()
    vc.performSegue(withIdentifier: "colorSelection", sender: nil)
}

Будем очень благодарны за любые предложения о том, как выполнить переход из этой функции.Ниже я приведу ключевые компоненты моего существующего кода, чтобы вы могли видеть, что я делаю.В обоих классах гораздо больше кода, но я думаю, что этого должно быть достаточно для общего представления о том, чего я пытаюсь достичь.

view controller:

class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate {
    override func viewDidLoad() {
        setupMenuBar()
    }

    let menuBar: MenuBar = {
        let mb = MenuBar()
        return mb
    }()

    private func setupMenuBar() {
        view.addSubview(menuBar)

        menuBar.translatesAutoresizingMaskIntoConstraints = false
        menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        menuBar.heightAnchor.constraint(equalToConstant: 80).isActive = true
    }
}

MenuBar.swift:

class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    lazy var collectionView : UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.clear
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupCollectionView()
    }

    private func setupCollectionView() {
        self.addSubview(collectionView)
        collectionView.register(MenuCell.self, forCellWithReuseIdentifier: "MenuCell")

        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let vc = UARTModuleViewController() // I want to perform a segue from here
        vc.performSegue(withIdentifier: "colorSelection", sender: nil)
    }

}

Заранее спасибо всем, кто может дать полезные советы и предложения!

1 Ответ

0 голосов
/ 26 ноября 2018

This

let vc = UARTModuleViewController()

Создает другой объект на лету, который не зависит от представленного и может вызвать сбой, если виртуальный канал не создан программно, вместо этого вам нужен делегат

lazy var menuBar: MenuBar = {
    let mb = MenuBar()
    mb.delegate = self
    return mb
}()

И добавьте эту переменную внутрь MenuBar

weak var delegate:UARTModuleViewController?

Затем используйте ее следующим образом:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    delegate?.performSegue(withIdentifier: "colorSelection", sender: nil)
}

Следует сказать, что лучшим подходом для повторного использования является создание протокола

protocol ColManager { 
   func navigate()
}

С

weak var delegate:ColManager?

И любой класс, который хочет использовать, должен соответствовать протоколу и реализовывать метод navigate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...