-setStringValue:
๋๋ -setAttributedStringValue:
๋ฅผ ํตํด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก NSTextField
์ ํ
์คํธ๋ฅผ ์ค์ ํ๋ฉด NSControlTextDidChangeNotification
ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค. ์ฆ, -rac_textSignal
์ด ๋ณ๊ฒฝ ์ฌํญ๋ ์ ํํ์ง ๋ง์ญ์์ค. ์ฌ์ฉ์ ์ํธ ์์ฉ์ผ๋ก ํ
์คํธ๋ฅผ ํธ์ง ํ ๋๋ง ์๋ํฉ๋๋ค.
์ฌ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ -rac_signalForSelector:
๋ฅผ ์ฌ์ฉํ์ฌ setter์ ๋ํ ํธ์ถ์ ์ฐจ๋จํ๋ ๊ฒ์
๋๋ค ( NSControlTextDidChangeNotification
๋ฑ๋กํ๋ ๊ฒ ์ธ์๋). ๋ค๋ฅธ ์์ด๋์ด๊ฐ ์์ต๋๊น?
์ฌ๊ธฐ์ AppKit๊ณผ์ ์ผ๊ด์ฑ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์
๋๋ค. rac_textSignal
๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ด์ฐฐ ํ ์์๋ ์ด๋ฒคํธ์ ๋ํด ๋ฐ์ํ๋ ๊ฒ์ IMO์
๋๋ค.
์ด๊ฒ์ด ํญ์ ์๋ฏธ๊ฐ์๋ ๊ฒ์ ์๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ทฐ ๋ ์ด์ด๋ก ์ ํ๋๋ ์ด๋ฒคํธ๋ "์ต์ข "์ผ๋ก ๊ฐ์ฃผ๋์ด์ผํฉ๋๋ค. ํด๋น ์ง์ ์ด์ ์ ํํฐ๋งํ๊ฑฐ๋ ๋ณํํด์ผํ๋ ๊ฒฝ์ฐ ๋ทฐ ๋ชจ๋ธ ๋๋ ํด๋น ๋ผ์ธ์ ๋ฐ๋ผ ์ํํด์ผํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ณ๊ฒฝ์ ๊ด์ฐฐํ๊ธฐ์ํ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น?
๊ตฌ์ฒด์ ์ธ ์ : ์ฌ๋ฌ ํ
์คํธ ํ๋์ ์ง์ฐ๊ธฐ ๋ฒํผ์ด์๋ ์์์ด ์๋๋ฐ ์ง์ฐ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด ๋ชจ๋ ํ
์คํธ ํ๋์์ @""
stringValue
์ด @""
๋ฉ๋๋ค. ์ผ๋ถ ์์ ์ ํจ์ฑ ๊ฒ์ฌ ๋
ผ๋ฆฌ์ rac_textSignal
๋ฅผ ์ฌ์ฉํ๊ณ -rac_textSignal
๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ฐ๊ธฐ๋ฅผ ํด๋ฆญํด๋ ์ ํจ์ฑ ๊ฒ์ฌ ์ํ๊ฐ ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ NSControlTextDidChangeNotification
๋ฅผ ์๋์ผ๋ก ๊ฒ์ํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋์ฐํ ์ผ์
๋๋ค. : trollface :
MVVM ์ธก๋ฉด์์ ์ฌ๋ฐ๋ฅธ ์ค๊ณ๋ ๋ทฐ๊ฐ ์๋ _view model_์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค. ๋ณด๊ธฐ ๋ชจ๋ธ์๋ ํ ์คํธ ํ๋์ ๋ํ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ Clear ๋ฒํผ์ ๋ทฐ ๋ชจ๋ธ์ ํ๋๋ฅผ ์ฌ์ค์ ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ ๋ฐ์ง์ :์ ๋๋ค.
MVC๋ ์ค๊ฐ ๋ทฐ ์ปจํธ๋กค๋ฌ ๋๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด ์๋นํ ์ ์ฌํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๊ณ ๋ คํ์ง๋ง ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ด ํน๋ณํ ๊ฒฝ์ฐ ๊ทธ ์์ฒด๋ก ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์์ด ์ง๋ฌธ๊ณผ๋ ๋ฌด๊ดํ๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๋ ์ข ๊ฒฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ฌ!
FWIW, Cocoa Bindings โข๊ฐ ๋ฌธ์ ๊ฐ ๋๋๋ผ๋ RACChannel
๋ฅผ ์ฌ์ฉํ์ฌ ์์กดํ์ง ์๋ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ๊ตฌ์ถ ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ค๋ซ๋์ ๋ซํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง @indragiek ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๋ค.
viewModel์ NSString* name
์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ทฐ ์ปจํธ๋กค๋ฌ์์ ํ
์คํธ ํ๋๋ฅผ ๋ทฐ ๋ชจ๋ธ์ ๋ฐ์ธ๋ฉํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ฐ์ธ๋ฉ ํ ๋ ๋ค์์ ์ํํฉ๋๋ค.
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/>
subscribeNext:^(NSString* text){<br i="10"/>
self.viewModel.name = text;<br i="11"/>
}];`
์ด๋ ๊ฒํ๋ฉด ํ ์คํธ ์ ํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์์ฑ์ ๋ํ ํ๋ก๊ทธ๋๋ฐ ๋ณ๊ฒฝ์ ๊ฐ์ง ํ ์ ์์ต๋๋ค.
@startupthekid ๊ฐ์ฌํฉ๋๋ค. ๋์์ด๋ฉ๋๋ค.
@startupthekid ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ด ์ค๋ซ๋์ ๋ซํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง @indragiek ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๋ค.
viewModel์
NSString* name
์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.๋ทฐ ์ปจํธ๋กค๋ฌ์์ ํ ์คํธ ํ๋๋ฅผ ๋ทฐ ๋ชจ๋ธ์ ๋ฐ์ธ๋ฉํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ฐ์ธ๋ฉ ํ ๋ ๋ค์์ ์ํํฉ๋๋ค.
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/> subscribeNext:^(NSString* text){<br i="10"/> self.viewModel.name = text;<br i="11"/> }];`
์ด๋ ๊ฒํ๋ฉด ํ ์คํธ ์ ํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์์ฑ์ ๋ํ ํ๋ก๊ทธ๋๋ฐ ๋ณ๊ฒฝ์ ๊ฐ์ง ํ ์ ์์ต๋๋ค.