据我所知,第一个响应者对象是根据输入活动等接收回调信号,并且它会将其冒充链,直到可以找到愿意处理它的响应者。
但更正式的是,第一响应者的范围是什么?例如,它是应用程序范围内的响应者吗?似乎第一响应者只是说这个特定对象将收到交互通知。另一个响应者可以窃取第一响应者状态吗?
请向我解释或指导一些相关信息。我已经阅读了Apple对响应者的一般解释。我正在寻找一个更加内置的解释。
答案 0 :(得分:15)
iOS中第一个响应者的范围由视图层次结构决定。请记住,响应者是响应者层次结构的一部分,并由Apple的文档定义:
响应者是一个可以响应事件并处理它们的对象。所有响应者对象都是最终从UIResponder(iOS)或NSResponder(OS X)继承的类的实例。
实际上,所有响应者都是潜在响应者链的一部分,一直到应用程序本身。这意味着响应者的范围取决于您必须走多远才能获得能够处理响应的对象。如果第一个响应者是UI元素,例如UITextField,则您的范围与该响应者的范围相关联。
在此图像中,iOS第一响应者层次结构显示在左侧(OS X在右侧):
要回答问题的第二部分,是的,如果用户与元素交互,对象可以“窃取”第一响应者状态,例如:
...你可以通过某些功能赋予他们第一响应者状态:
[textField3 becomeFirstResponder]; //This is now the first responder
[textField4 becomeFirstResponder]; //Now textField4 has 'stolen' first responder status
[textField4 resignFirstResponder]; //The text field has resigned its first responder status to the next level up
对于其他读过这篇文章的人来说,还没有找到关于Apple的文档,一个好的起点是这里的Responder层次结构解释: https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html
我希望这有帮助!
答案 1 :(得分:10)
它是窗口的属性。窗口始终不超过一个第一响应者。任何UIResponder都可以通过发送becomeFirstResponder
来声明第一响应者状态,这就是为什么你可以让UITextField获得"焦点"通过发送该消息给它。
答案 2 :(得分:0)
请先记住窗口对象,然后再处理。
当应用程序对象获取触摸对象时,其他对象将转换为其事件对象,并将其分派给窗口对象。窗口对象将发送到最合适的对象以处理事件(响应者链)。因此,窗口实例不再具有第一个响应者实例的属性。
weak var firstResponder: NSResponder? { get }