Как определить viewController, на который была добавлена ​​кнопка? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу знать, как назывался viewController при нажатии кнопки.Я уже изучил ответ, предоставленный здесь .Но я верю, что это не сработает, если у меня на экране будут разные контейнерные виды ... где viewController для каждой кнопки может быть разным.Следовательно, мне нужно другое решение.

Поэтому я написал эту функцию для рекурсивного просмотра, пока она не найдет UIViewController.

extension UIView{
    func getTypeOfMyViewController() -> UIViewController.Type?{
        if let _super = superview as? UIViewController{ // logically wrong!
            return type(of:_super)
        }else if let _super = superview{
            return _super.getTypeOfMyViewController()
        }else{
            assertionFailure("everything should end up being on some viewController")
            return nil
        }
    }
}

Единственная проблема - это строка:

if let _super = superview as? UIViewController{

Это дает мне следующее предупреждение:

В ролях из 'UIView?'к несвязанному типу 'UIViewController' всегда происходит сбой

superview - это UIView, и я не знаю, как извлечь 'viewController', который содержит 'view' ,

Вопрос1: Итак, как мне это сделать?

Кроме того, я хотел бы использовать функцию getTypeOfMyViewController как таковую:

extension UIButton{
    open override var accessibilityLabel: String?{
        get {
            return "\(getTypeOfMyViewController.self): \(titleLabel?.text ?? "Null")"
        }
        set{
            // nothing particular
        }
    }
}

Я делаю это потому, что хочу создать уникальный идентификатор для всех нажатий кнопок в моей системе ведения журналов.

Вопрос2: Предлагает ли Swift какое-либо более простое решение этой проблемы?

1 Ответ

0 голосов
/ 01 июня 2018

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

. Идите вверх по цепочке респондентов, пока не дойдете до контроллера представления:

var r : UIResponder = theButton
repeat { r = r.next! } while !(r is UIViewController)
let vc = r as! UIViewController
...