Когда я создаю объект UIStoryBoard в методе, реализованном в расширении протокола, я получаю EXC_BAD_ACCESS - PullRequest
0 голосов
/ 11 декабря 2018

Я использую код OverlayViewController из https://github.com/agordeev/OverlayViewController в проекте.

В этом коде есть протокол и расширение, которое добавляет реализацию для протоколов двумя методами:

protocol OverlayHost {
    func showOverlay<T: OverlayViewController>(type: T.Type, storyboardName: String) -> T?
    func showOverlay<T: OverlayViewController>(identifier: String, storyboardName: String) -> T?
}

extension OverlayHost where Self: UIViewController {

    @discardableResult
    func showOverlay<T: OverlayViewController>(type: T.Type, fromStoryboardWithName storyboardName: String) -> T? {
        let identifier = String(describing: T.self)
        return showOverlay(identifier: identifier, fromStoryboardWithName: storyboardName)
    }

    @discardableResult
    func showOverlay<T: OverlayViewController>(identifier: String, fromStoryboardWithName storyboardName: String) -> T? {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        guard let overlay = storyboard.instantiateViewController(withIdentifier: identifier) as? T else { return nil }
        overlay.presentOverlay(from: self)
        return overlay
    }
}

Когда я пытаюсь представить оверлей (UIViewController в раскадровке), ничего не происходит.В исследовании я заметил, что когда код выше создает объект UIStoryboard, я получаю сообщение об ошибке:

let storyboard = UIStoryboard(name: storyboardName, bundle: nil)

выдает ошибку:

expression produced error: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x5a10432956f).
The process has been returned to the state before expression evaluation.

Если я вызываю упомянутую строкуза пределами расширения я не вижу этой ошибки.

Еще один момент, который может иметь или не иметь значение, заключается в том, что вызов метода в расширении, где возникает ошибка, происходит от метода в расширенииродитель:

extension MenuViewController: UITableViewDelegate {

...

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row == 2 {
            showOverlay(type: OverlayViewController.self, storyboardName: "MenuStoryboard")
        }
    }
}

Идеи?

Обновление: так что это наложение работает, но я все еще вижу эту ошибку, сообщенную в Xcode.

...