Как работает цепь ответчика в IPhone?Каковы «следующие респонденты»? - PullRequest
26 голосов
/ 19 июля 2011

Вот что говорится в документации:

Если первый респондент [на сообщение о событии или действии] не может обработать сообщение о событии или действии, он перенаправляет его «следующему респонденту» вСвязанный ряд называется цепочкой респондента.Цепочка респондента позволяет объектам респондента передавать ответственность за обработку сообщения о событии или действии другим объектам в приложении.

Если объект в цепочке респондента не может обработать событие или действие, он отправляет сообщение следующемуОтветчик в цепочке.Сообщение перемещается вверх по цепочке к объектам более высокого уровня, пока не будет обработано.Если он не обрабатывается, приложение отбрасывает его.

Хорошо, каков следующий респондент?

Это родительское представление?Вид за этим?Как iOS определяет, кто является первым и вторым респондентами?

Ответы [ 5 ]

29 голосов
/ 20 июля 2011

Первый респондент - это очень специфическая концепция в Какао.Единственный раз, когда iOS решает установить Первый ответчик, - это когда текстовое поле получает фокус.В остальное время вы должны явно контролировать, какой объект вы хотите использовать в качестве первого респондента (см. -CanBecomeFirstResponder, -becomeFirstResponder).

Второго респондента не существует.

У всех респондентов есть NextResponder (может быть ноль).Это означает, что, начиная с любого респондента, может быть (но не может быть) цепочка респондентов произвольной длины ( Responder -> nextResponder -> nextResponder -> etc ), вдоль которых передаются события до их обработки.

Существует цепочка по умолчанию, которую можно просматривать -> superview -> superview, но она также может включать UIViewControllers, UIWindows, UIWindowControllers, UIApplication и другие, поэтому она сильно зависит от вашей иерархии объектов (не только ваша иерархия представлений - поэтому нет, вы не можете сказать, что nextResponder всегда является родительским представлением).В OSX 10.6 цепочка по умолчанию даже отличается для разных типов событий и действий и может даже включать делегата вашего приложения, который может быть, а может и не быть ответчиком, я не уверен, так ли это в iOS.

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

Респондентцепь довольно важна и сложна, вам нужно время, чтобы прочитать об этом документы Apple.

18 голосов
/ 19 июля 2011

Из документов для nextResponder :

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

4 голосов
/ 21 августа 2018

Приложения получают и обрабатывают события, используя объекты респондента.

Объектом-ответчиком является любой экземпляр класса UIResponder ,

  • общие подклассы включают

    UIView, UIViewController и UIApplication .

Ответчики получают необработанные данные события и должны либо обработать событие, либо переслать его другому объекту ответчика.

Когда ваше приложение получает событие, UIKit автоматически направляет это событие на

  • наиболее подходящий объект респондента, известный как

    первый респондент.

Необработанные события передаются от респондента к респонденту в цепочке активных респондентов,

, которая является динамической конфигурацией объектов респондента вашего приложения.

Теперь посмотрите на снимок экрана ниже. Также рассмотрим иерархии представлений спереди:

img

UIbutton / UITextField - (nextResponder) -> UIView - (nextResponder) -> UIViewController

- (nextResponder) -> UIWindow - (nextResponder) -> UIApplication - (nextResponder) -> UIApplicationDelegate

Так работает цепочка Responder на iOS, надеюсь, она кому-нибудь поможет. Последняя статья на сайте Apple -> Ссылка (Очень хорошо объяснено).

3 голосов
/ 02 сентября 2017

Цепочка респондента для любого события:

UIView -> ViewController -> Window-> Делегат приложения

Запустите приведенный ниже код для лучшего понимания.

//
//  AppDelegate.swift
//  ResponderChain
//
//  Created by Ankit on 02/09/17.
//  Copyright © 2017 Ankit. All rights reserved.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("App Delegate touch began")
    }


}



//
//  ViewController.swift
//  ResponderChain
//
//  Created by Ankit on 02/09/17.
//  Copyright © 2017 Ankit. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("ViewController touch Began")
        next?.touchesBegan(touches, with: event)
    }


}

extension UIWindow{
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Window Touch Began")
        next?.touchesBegan(touches, with: event)
    }
}
extension UIView{
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("UIView touch Began")
        next?.touchesBegan(touches, with: event)
    }
}
2 голосов
/ 06 августа 2015

Цепочка респондента - это серия связанных объектов респондента. Он начинается с первого респондента и заканчивается объектом приложения. Если первый респондент не может обработать событие, он перенаправляет событие следующему респонденту в цепочке респондентов.

Объект респондента - это объект, который может реагировать на события и обрабатывать их. Класс UIResponder является базовым классом для всех объектов респондента и определяет программный интерфейс не только для обработки событий, но и для общего поведения респондента. Экземпляры классов UIApplication, UIViewController и UIView являются ответчиками, что означает, что все представления и большинство ключевых объектов контроллера являются ответчиками. Обратите внимание, что слои Core Animation не являются ответчиками.

Первый респондент назначен получать события первыми. Как правило, первым респондентом является объект просмотра. Объект становится первым респондентом, выполняя две вещи:

Overriding the canBecomeFirstResponder method to return YES.

Receiving a becomeFirstResponder message. If necessary, an object can send itself this message.

см. Apple Doc для более подробного объяснения.

...