Using Responders and the Responder Chain to Handle Events ๋ฒ์ญ
04 Jul 2018 | iOSResponder Chain์ ๋ํด์ ๊ณต๋ถํ๋ค๊ฐ ์ ํ ๊ฐ๋ฐ์ ๋ฌธ์์ ์๋ article์ ๋ฒ์ญํ์ฌ ์ ๋ฆฌํด๋ณด์๋ค. ๊ฐ์ธ ๊ณต๋ถ์ฉ์ผ๋ก ๋งค์ฐ roughํ๊ฒ ๋ฒ์ญํ๊ณ ์ ๋ฆฌํ ๊ธ์ด๋ผ ์ค์ญ ๋ง์ ์ ์์!
Using Responders and the Responder Chain to Handle Events
- ์ฑ์ responder ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋งํ๋ค.
- responder๊ฐ์ฒด๋ UIResponderํด๋์ค์ ์ธ์คํด์ค์ด๊ณ , ๊ณตํต์ ์ผ๋ก UIView, UIViewController, UIApplication๊ฐ์ฒด๋ฅผ ์๋ธํด๋์คํ๋ค.
- Responder๋ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฑฐ๋ ์ฒ๋ฆฌํ๊ณ , ์๋๋ฉด ๋ค๋ฅธ responder๊ฐ์ฒด๋ก(ํด๋น ์ด๋ฒคํธ๋ฅผ ํด๊ฒฐํ ์ ์๋)์ ๋ฌํด์ผํ๋ค.
-
์ฑ์ด ์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ฉด UIKit์ ๊ฐ์ฅ ์ ์ ํ first responder์๊ฒ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ๋ค.
- ์ฒ๋ฆฌ๋์ง ์์(Unhandled)์ด๋ฒคํธ๋ responder chain์ ์ํด์ responder๊ฐ์ฒด๋ก ์ ๋ฌ๋๋ค.
- ๋ง์ฝ ํ ์คํธํ๋๊ฐ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋งํ์ง ์์ผ๋ฉด, UIKit์ ์ด๋ฒคํธ๋ฅผ ์์ UIView๋ก ๋ณด๋ธ๋ค.
- ์๋์ฐ๊น์ง ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋์์๋ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋ฆฌํ ์ ์์ผ๋ฉด, ์ด๋ฒคํธ๋ UIApplication๊น์ง ์ ๋ฌ๋๋ฉฐ, and possibly to the app delegate if that object is an instance of UIResponder and not already part of the responder chainโฆ.??
์ด๋ฒคํธ์ first responder๊ฒฐ์ ํ๊ธฐ
UIKit์ ์ด๋ฒคํธ์ ํ์ ์ ๋ฐ๋ผ์ FirstResponder ๊ฐ์ฒด๋ฅผ ์ง์ ํ๋ค.
- Touch event: ํฐ์น๊ฐ ์ผ์ด๋ ๋ทฐ
- Press event: ํฌ์ปค์ค๋ฅผ ๊ฐ์ง ๋ทฐ(The object that has focus.)
- Shake-motion event: ๋ด๊ฐ ์ง์ ํ ๊ฐ์ฒด (The object that you (or UIKit) designate.)
- Remote-Control event: ๋ด๊ฐ ์ง์ ํ ๊ฐ์ฒด (The object that you (or UIKit) designate.)
- Editing menu messages: ๋ด๊ฐ ์ง์ ํ ๊ฐ์ฒด (The object that you (or UIKit) designate.) ๋ฆฌ๋ชจํธ์ปจํธ๋กค์ด๋ editing menu๊ฐ ๋ญ์ง..
cf) Core Motion Framework
Motion events related to the accelerometers, gyroscopes, and magnetometer do not follow the responder chain. Instead, Core Motion delivers those events directly to the designated object. For more information, see Core Motion Framework
- ์ปจํธ๋กค์ ์์ ๋ค๊ณผ ๊ด๋ จ๋ ํ๊ฒ ๊ฐ์ฒด์ ์ก์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
- ์ปจํธ๋กค์ ํ๊ฒ ๊ฐ์ฒด๊ฐ nil์ผ๋, UIKit์ ์ฌ๋ฐ๋ฅธ ์ก์ ๋ฉ์๋๊ฐ ๊ตฌํ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ํ๊ฒ ๊ฐ์ฒด๋ถํฐ responder chain๊น์ง ์ง๋๋ค๋๋คโฆํ์ํ๋คโฆ์ฐพ์๋ค๋๋คโฆ?
- For example, the UIKit editing menu uses this behavior to search for responder objects that implement methods with names like cut(:), copy(:), or paste(_:).
- Action messages are not events, but they may still take advantage of the responder chain.
- GestureRecognizer๋ touch๋ press ์ด๋ฒคํธ๋ฅผ ์์ ์ ๋ทฐ๋ณด๋ค ๋จผ์ ๋ฐ๋๋ค
- ๋ง์ฝ ๋ทฐ์ GestureRecognizer๊ฐ ํฐ์น ์ํ์ค๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ฉด, UIKit์ ๋ทฐ์ ํด๋น ํฐ์น์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ๋ค.
- ๋ง์ฝ ๋ทฐ๊ฐ ํฐ์น๋ฅผ ํธ๋ค๋ง ํ์ง ๋ชปํ๋ฉด, UIKit์ Responder chain์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ๋ค.
์ด๋ค Responder๊ฐ ํฐ์น ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ผ ํ๋์ง ๊ฒฐ์ ํ๊ธฐ
- UIKit์ ์ด๋์ ํฐ์น ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ๋์ง ์๊ธฐ์ํด ๋ทฐ ๊ธฐ๋ฐ์ hit-testing์ ์ฌ์ฉํ๋ค.
- UIKit์ ๋ทฐ ๊ณ์ธต๊ตฌ์กฐ์ ์๋ ๋ทฐ๋ค์ bound์ ์์น๋ฅผ ๋น๊ตํ๋ฉฐ ํฐ์น์ ์์น๋ฅผ ๋น๊ตํ๋ค.
- hitTest()๋ฉ์๋๋ ๋ทฐ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ฉด์, ๊ฐ์ฅ ๊น์ ๋จ์ ์๋ ์๋ธ๋ทฐ๋ฅผ ํ์ํ๋ฉด์ ํน์ ํฐ์น๋ฅผ ํฌํจํ ์๋ธ๋ทฐ๋ฅผ ์ฐพ์๋ธ๋ค.
- ํฐ์น ๋ก์ผ์ด์ ์ด๋ ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, UIKit์ ๋๊ฐ์ UITouch ๊ฐ์ฒด๋ฅผ ์๋ก์ด ์ ๋ณด์ ํจ๊ป ์ ๋ฐ์ดํธํ๋ค.
- (๋ง์ฝ ํฐ์น ์์น๊ฐ ์๋ ๋ทฐ๋ฅผ ๋ฒ์ด๋๋, ํฐ์น๊ฐ์ฒด ๋ด์ view ํ๋กํผํฐ๋ ๋ณํ์ง ์๋๋ค.)
- ํฐ์น๊ฐ ๋๋๋ฉด UIKit์ UITouch๊ฐ์ฒด๋ฅผ ๋ฆด๋ฆฌ์ฆํ๋ค.
Responder Chain์ ๋ฐ๊พธ๊ธฐ
- next ํ๋กํผํฐ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํจ์ผ๋ก์จ ๋ฆฌ์คํฐ๋์ฒด์ธ์ ๋ณ๊ฒฝ ํ ์ ์๋ค.
- (When you do this, the next responder is the object that you return.)
- UIKit ํด๋์ค๋ค์ ์ด๋ฏธ ์ด ํ๋กํผํฐ๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ํน์ ํ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ์ฌ ์ด๋ฏธ ์ด ํ๋กํผํฐ๋ฅผ ๊ตฌํํด๋จ๋ค.
-
UIView objects. If the view is the root view of a view controller, the next responder is the view controller; otherwise, the next responder is the viewโs superview.
- UIViewController objects.
-
If the view controllerโs view is the root view of a window, the next responder is the window object.
-
If the view controller was presented by another view controller, the next responder is the presenting view controller.
-
-
UIWindow objects. The windowโs next responder is the UIApplication object.
- UIApplication object. The next responder is the app delegate, but only if the app delegate is an instance of UIResponder and is not a view, view controller, or the app object itself.
-