iOS Цепочка и события респондента - PullRequest
1 голос
/ 29 января 2020

Я немного растерялся. В стеке UINavagationController есть два UIViewControllers. Я пытаюсь вызвать метод first UIViewController в течение second UIViewController. См. Код ниже

class VC1: UIViewController {

    @objc func method1() {
        //not called after tap button
    }
}

class VC2: UIViewController {

    let button = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()

        button.addTarget(nil, action: #selector(VC1.method1), for: .touchUpInside)
    }
}

Но method1 не вызывается, когда я нажимаю на кнопку. В чем проблема?

Ответы [ 3 ]

1 голос
/ 29 января 2020

Цепочка респондента, начиная с button, проходит через предки button и контроллеры представлений. Поскольку VC1 и VC2 являются отдельными элементами в стеке контроллера навигации, VC1 не является предком VC2. Они больше похожи на братьев и сестер друг друга. Таким образом, VC1 не входит в цепочку респондента button.

Вы можете просто установить VC1 в качестве цели действия кнопки:

let vc1: VC1 = ...
button.addTarget(vc1, action: #selector(VC1.method1), for: .touchUpInside)

Но это означает, что VC2 требуется ссылка на существующий Экземпляр VC1. Как вы получили эту ссылку? Это зависит от того, как вы создали VC2 и поместили его в стек навигации.

Если VC1 создает VC2 в коде, тогда VC1 может просто дать новому VC2 ссылку на self (VC1) при создании VC2 .

Если у вас есть переход от раскадровки от VC1, который помещает VC2 в стек, то вам нужно внедрить prepare(for: UIStoryboardSegue, sender:) в VC1, и в этом методе вам нужно передать self (VC1) к месту назначения. of the segue (VC2).

1 голос
/ 29 января 2020

Цепочка респондента основана на суперпредставлениях и родительских контроллерах представления. Таким образом, VC1 не входит в цепочку респондента из VC2. Цепочка респондента из VC2 ведет к его родителю (UINavigationController); это не go через других дочерних элементов UINavigationController.

0 голосов
/ 30 января 2020
  • Когда вы набираете sh, связь устанавливается между pressedViewController и navigationController.
  • При модальном представлении взаимосвязь между presentViewController и UIWindow. Понятно, что существует связь между представленным и представленным контроллерами представления, но это просто вопрос наличия у них ссылок друг на друга. Они не подключены через конвейер цепочки респондента ...
  • Только когда viewController становится childViewController другогоViewController, тогда их цепочка респондента подключается так, как вы думаете, что означает, что nextResponder childViewController становится его «parentViewController»

———

С nextResponder документы :

Например, UIView реализует этот метод и возвращает UIViewController объект, который управляет им (если он есть) или его суперпредставление (если его нет). UIViewController аналогичным образом реализует метод и возвращает суперпредставление своего представления. UIWindow возвращает объект приложения. Общий объект UIApplication обычно возвращает nil, но он возвращает свой делегат приложения, если этот объект является подклассом UIResponder и еще не был вызван для обработки события.

Читая это, мы понимаем, что ни presentingViewController ни pushingViewController не являются суперпредставлением viewController

...