Как работает цепь ответчика в IPhone? Каковы "следующие респонденты"?

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

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

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

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

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

5 ответов

Решение

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

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

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

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

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

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

Из документов на следующий ответ:

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

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

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

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

    UIView, UIViewController и UIApplication.

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

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

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

    первый ответчик.

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

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

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

IMG

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

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

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

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

UIView -> ViewController -> Window-> App Delegate

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

//
//  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)
    }
}

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

Объект респондента - это объект, который может реагировать на события и обрабатывать их. Класс 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 для более подробного объяснения.

Другие вопросы по тегам