๊ฐœ๋ฐœ ์‹œํ–‰์ฐฉ์˜ค 7

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] MVC ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด์ž

๐Ÿค” ๋ฐฐ๊ฒฝ & ๋ฌธ์ œ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜๋ก ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ๊ธฐ์ค€์ด ํ”„๋กœ์ ํŠธ ๊ฐ€๋…์„ฑ ๋‚ฎ์ถ”๊ณ  ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ์ผ๋ฐ˜ํ™”๋˜์ง€ ์•Š์€ View ๊ตฌํ˜„์œผ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐ˜๋ณต ์ž‘์—…์ด ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ๋‚ด์šฉ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง„ BottomMenuViewController์™€ ๊ฐ™์ด, ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ๋ฐ ๊ฐœ์„  ์‹œ ์ง„ํ–‰์˜ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (๋‚ด์šฉ ๊ฒฐํ•ฉ๋„: ๊ฐœ์ฒด ๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด ๋‚ด๋ถ€์— ์ง์ ‘ ์ ‘๊ทผํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๊ณ„) ๐Ÿ•ต๏ธ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๋„์ž…ํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์Šคํ…œ ๊ตฌ์กฐ์™€ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๊ฐœ์ฒด ๊ฐ„ ์ ์ ˆํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ View์˜ ์ผ๋ฐ˜ํ™”์— ์ง‘์ค‘..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView์— Cell์ด ํ•˜๋‚˜๋งŒ ๋ณด์ด๋Š” ์ด์œ 

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ปChapterList๋ฅผ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, ๋ถ„๋ช… item์ด 3๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ cell์ด 1๊ฐœ๋งŒ ๋ณด์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค! ๊ทธ๋ž˜์„œ ์ด์ „์— ์ž‘์—…ํ–ˆ๋˜ BookList์—์„œ๋„ ํ™•์ธํ•ด ๋ณด๋‹ˆ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.. BookList์—์„œ๋Š” item์ด ํ•˜๋‚˜๋งŒ ์žˆ์—ˆ๋˜์ง€๋ผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋ถ„๋ช… BookList์— ๊ฐ์ฒด๊ฐ€ 3๊ฐœ๊ฐ€ ๋‹ด๊ธด ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์šฉํ•  ๋•Œ๋งŒ ํ•ด๋„ ํ™”๋ฉด์— item๋“ค์ด ์ž˜ ๋‚˜ํƒ€๋‚ฌ๋Š”๋ฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์šฉํ•œ ๋’ค ์ž‘์—…ํ–ˆ๋˜ Section๋ณ„ UI ์ž‘์—…์—์„œ ๋กœ์ง์ด ๋ฐ”๋€Œ๋ฉด ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. CollectionViewLayout๋ถ€ํ„ฐ DiffableDataSource๋ฅผ ๊ฑฐ์ณ Snapshot๊นŒ์ง€ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ณผ์ •์„ ๊ธฐ๋กํ•ด๋ณด์ž~      ๐Ÿ–ผ๏ธ CollectionViewCompositionalLa..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] URLSession์œผ๋กœ multipart/form-data ์š”์ฒญ

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป์•จ๋ฒ”์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ์ž‘์—…์ด ์ฃผ์–ด์กŒ๋‹ค. ์ด์ „์— ๋ช‡ ๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„๋ณธ ๊ฒฝํ—˜์ด ์žˆ์–ด ๋ฌด๋ฆฌ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ๋•Œ๋Š” 3rd party์ธ Alamofire๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์„œ ๊ฐ„๋‹จํ–ˆ์—ˆ๊ณ  ์ง€๊ธˆ์€ Apple์˜ built-in์ธ URLSession์„ ์‚ฌ์šฉํ•ด์•ผํ•ด์„œ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋‹ค.   ๐Ÿ˜ฎ cURL Vs HTTPAPI๋ฌธ์„œ๋Š” ํ‘œํ˜„์˜ ์ฐจ์ด ๋“ฑ์œผ๋กœ iOS๋งŒ ์•Œ๊ณ  ์žˆ์–ด์„œ๋Š” ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋™์•ˆ ํ•ด์™”๋˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๊ฒฝํ—˜๊ณผ ๊ตฌ๊ธ€๋ง์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์ž˜ ์ดํ•ดํ•˜๋ฉฐ ์—ฐ๊ฒฐํ•ด์™”๋‹ค. ์˜ค๋žœ๋งŒ์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ API๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ฐพ์•„ ๊ณต๋ถ€ํ–ˆ๋˜ mutipart/form-data ์—ฐ๊ฒฐ ๊ตฌ์กฐ์™€๋Š” ๋งŽ์ด ๋‹ฌ๋ผ ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•œ๊ฑด๊ฐ€ ์‹ถ์–ด ๊ตฌ๊ธ€๋ง์„ ์ •๋ง ..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView์˜ Section ์ˆจ๊ธฐ๊ธฐ -CompositionalLayout

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป ์›๋ž˜ Section์ด ํ•œ ๊ฐœ์˜€๋˜ collection view๋ฅผ ๋‘ ๊ฐœ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์•„์ดํ…œ์ด ์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ํ……- ๋นˆ ๊ณต๊ฐ„์ด ๋‚จ๊ฒŒ ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„ ์•„์ดํ…œ์ด ์—†์„ ๊ฒฝ์šฐ Section์„ ์ˆจ๊ธฐ๊ณ ์ž ๊ณ„ํšํ–ˆ๋‹ค. How to deal with empty items section Section์„ ์ ‘๋Š” ๊ฑด ์ž์ฃผ ๋ณด์ด๋Š” ๊ธฐ๋Šฅ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ๊ณต์‹๋ฌธ์„œ์„ ์—ด์‹ฌํžˆ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๋˜ ์—ด์‹ฌํžˆ ๊ตฌ๊ธ€๋ง์„ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž์ฃผ ๋ดค๋˜ Section ์ˆจ๊น€ ๊ธฐ๋Šฅ์€ ๋ณดํ†ต TableView๋ฅผ ํ™œ์šฉํ•œ ๊ฒƒ์ด๊ฑฐ๋‚˜ FlowLayout์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ, ๋‚˜๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ Section์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ๊ณ„ํš์ด..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ] CollectionView ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ (Performing reloadData as a fallback — Invalid update)

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป CollectionView๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด cell ์‚ญ์ œ, ์ถ”๊ฐ€, ๋ณ€๊ฒฝ ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์œ ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋•Œ reloadData, reloadSection, deletedItem, insertItem ๋“ฑ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ด€๋ จํ•˜์—ฌ CollectionView์˜ ๋ ˆ์ด์•„์›ƒ์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ [UICollectionView] Performing reloadData as a fallback — Invalid update: invalid number of items in section 0. ... deleteItem ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด CollectionView๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค ํ•˜๋Š”๋ฐ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  collectionView์— ์–ด๋– ํ•œ ๋ณ€ํ™”๋„ ์—†์—ˆ๋‹ค..

[ iOS/Git ์‹œํ–‰์ฐฉ์˜ค ] Push๋œ Info.plist๋ฅผ .gitignore์— ํ• ๋‹นํ•˜๊ธฐ

๐Ÿ‘ฉ‍๐Ÿ’ป๋ฐฐ๊ฒฝ๐Ÿ‘ฉ‍๐Ÿ’ป ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด ํ† ํฐ ๋“ฑ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. Local ์ €์žฅ์†Œ์—์„œ๋งŒ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์— ๋Œ€ํ•ด ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, Github๊ณผ ๊ฐ™์€ ์›๊ฒฉ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ๋ฏธ์ฒ˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋ชปํ•˜๊ณ  ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ดํ‚น์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bundle์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋„ ๊น”๋”ํ•ด์ง€๊ณ  ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋„ ํŽธ๋ฆฌํ•ด์„œ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒˆ๋“ค๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์ข‹๋‹ค. ์ด์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์ค‘์š”ํ•œ ์ •๋ณด๋“ค์„ Info.plist ๋„ฃ๊ณ  ์ด plist ํŒŒ์ผ์„ .gitignore์— ์ถ”๊ฐ€ํ•˜๋ ค ํ–ˆ๋‹ค .gitignore์— ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ .gitignore์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๋‹ค. .gitignore ํŒŒ์ผ์„ ์—ด๊ณ  ์›ํ•˜๋Š”..

[ iOS ์‹œํ–‰์ฐฉ์˜ค ]Custom Switch

์›ํ•˜๋Š” switch ๋””์ž์ธ์ด Apple์˜ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” UISwitch์™€ ๋น„์Šทํ•˜๋ฉด์„œ๋„ ๋‹ฌ๋ผ ์ปค์Šคํ…€์„ ์ง„ํ–‰ํ–ˆ๋‹ค. UISwitch testSwitch.transform = CGAffineTransform(scaleX: 2, y: 0.7) ์ฒ˜์Œ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” UISwitch์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •๋ง ์‚ฌ์ด์ฆˆ๋งŒ ์กฐ์ •๋˜์–ด ์›ํ•˜๋Š” UI๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ์ดํ›„๋กœ๋„ UISwitch๋ฅผ ์ปค์Šคํ…€ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋งŒ ์ œ์‹œ๋˜์–ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. UIView switch๋ฅผ ์›ํ•˜๋Š” ๋””์ž์ธ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ UIView๋ฅผ ์ปค์Šคํ…€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋ฐ”ํƒ•์ด ๋˜๋Š” bar์™€ ์ž‘๋™๋˜๋Š” ๊ฑธ ๋ณด์—ฌ์ฃผ๋Š” ์›ํ˜•๋ฒ„ํŠผ์œผ๋กœ switch๋ฅผ ๊ตฌ๋ถ„ํ•ด view๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์ด ๋‘ ๊ฐœ์˜..

728x90