Reactivecocoa: NSControl -rac_textSignal์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 08์›” 27์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ReactiveCocoa/ReactiveCocoa

-setStringValue: ๋˜๋Š” -setAttributedStringValue: ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ NSTextField ์— ํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๋ฉด NSControlTextDidChangeNotification ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, -rac_textSignal ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ์„ ํƒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ํŽธ์ง‘ ํ•  ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‰ฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ -rac_signalForSelector: ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ setter์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ( NSControlTextDidChangeNotification ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„). ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋žซ๋™์•ˆ ๋‹ซํ˜”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ @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"/> }];`

์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ…์ŠคํŠธ ์‹ ํ˜ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ํ…์ŠคํŠธ ์†์„ฑ์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  8 ๋Œ“๊ธ€

์—ฌ๊ธฐ์„œ 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 ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰