์ฃผ์ : ๋ง์ผ์ปฌ๋ฆฌ A์กฐ
ํ์ : ํด ( ์ฐ ) - ์๋ฒ ( ์คํฐ๋ธ, ์๋ฆฌ )
๋ด์ฉ : ๋ผ์ด์ง์บ ํ 2์ฃผ๊ฐ ํด๋ผ์ด์ธํธ - ์๋ฒ ํ์ ํ๋ก์ ํธ ์งํ
๊น ๋งํฌ :
https://github.com/mock-rc3/MarketKurly_test_iOS_Yeon
๊ฐ๋ฐ
- UI
- ์ฌ๋ฌ ๋๋ฐ์ด์ค์์๋ ๊นจ์ง์ด ์๋๋ก AutoLayout๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์ฝ์กฐ๊ฑด์ ์ค์ ํ์๋ค.
- ์์ - ์ด๋ฏธ์ง๋ฅผ ์บก์ณํ์ฌ ์์ฃผ ์ฌ์ฉํ๋ ์์์ โ์น ์ฌ์ดํธ(์ด๋ฏธ์ง์์ ์์ ์ถ์ถํ์ฌ hex๋ก ๋ง๋ค๊ธฐ)โ ๋ฅผ ํตํด Extension UIColor์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ์๊ณ , ๊ทธ ์ธ ํ ๋๋ฒ ์ฌ์ฉํ ์์์ ์คํฌ์ด๋๋ก ์ถ์ถํ์ฌ ์ฌ์ฉ
- ์ด๋ฏธ์ง ๋๋ผ๋ฅผ ๋ฐ๊ฑฐ๋ ๋น์ทํ ํํ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด์ ๋ฐ์์ ์ฌ์ฉํ์๋ค.
- ์ฝ๋
-
์ฝ๋ ๊ด๋ฆฌ๋ MARK๋ฅผ ์ฌ์ฉํ์๋ค. ํ๋กํผํฐ, Component ๋ถ๋ถ, LifeCycle, Functions, objc Functions ๋ฑ ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๋ ์ฝ๋์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง ๋๋ ์ฐพ๊ธฐ๊ฐ ์์ํ์๋ค.
-
์์ฃผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ ์ฝ๋ ๋นผ๋๊ธฐ
-
ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌ
-
์ต๋ํ ์ฝ๋๋ก ์ง์ ๊ตฌํํ์๊ณ , ์๊ฐ์ ์ค๋๊ฑธ๋ฆด ๊ฒ ๊ฐ์ ๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉ ( ๋จ, ๋ด ํ๋ฉด์ ๋ง๊ฒ ์ปค์คํ ํ์ฌ ์ฌ์ฉ )
-
์๋ฒ์ ์ฐ๋ํ๋ ๋ถ๋ถ์ ๋ฐ๋ก ํจ์๋ก ๋ถ๋ฆฌ
-
๊ฐ๋ฐ๋ฒ์
- ํ์๊ฐ์
- ๋ก๊ทธ์ธ, ๋ก๊ทธ์์
- ์์ด๋์ฐพ๊ธฐ ( ์ด๋ฉ์ผ, ์ ํ๋ฒํธ )
- ๋น๋ฐ๋ฒํธ์ฐพ๊ธฐ (์ด๋ฉ์ผ, ์ ํ๋ฒํธ )
- ๋ง์ด์ปฌ๋ฆฌ ( ๋นํ์, ํ์ )
- ํ์ ์ ๋ณด ํ๋ฉด ํ์
- ์ ์ฒด๋ฑ๊ธ ๋ณด๊ธฐ, ๋ค์๋ฌ ์์๋ฑ๊ธ ๋ณด๊ธฐ, ์๋ฆผ์ค์ , ์ฐํ ์ํ, ์น๊ตฌ์ด๋, ๋ฐฐ๋, ์ ๋ฌผ๋ด์ญ, ๊ณต์ง์ฌํญ, ๊ณ ๊ฐ์ผํฐ, ์ด์ฉ์๋ด
- ๊ฐ์ ํํ๋ณด๊ธฐ, ์ปฌ๋ฆฌ ํผํ ๋ฐ์ค, ์ปฌ๋ฆฌ ์๊ฐ, ์ปฌ๋ฆฌํจ์ค, ๋ฐฐ์ก์๋ด
- ์ํ ํ๊ธฐ( ์์ฑ๊ฐ๋ฅํ๊ธฐ, ์์ฑ์๋ฃํ๊ธฐ ) - ๊ตฌ๋งคํ๊ฒ ์์ด์ ํ๋ฉด์ด ์ด๋ป๊ฒ ๋์ค๋์ง ๋ชฐ๋ผ์ ๊ธฐ๋ณธํ๋ฉด๋ง ํ์
- ๋ฐฐ์ก์ง
- ๋ฐฐ์ก์ง ์ ํ ( ์๋จ ๋ง์ปค ํด๋ฆญ )
- ๋ฐฐ์ก์ง ๊ด๋ฆฌ
- ๋ฐฐ์ก์ง ์ถ๊ฐ ( ์ฃผ์๊ฒ์, ์์ธ์ฃผ์ ์์ฑ )
- ๋ฐฐ์ก์ง ์์ , ์ญ์
- ์ฃผ๋ฌธ์์์ ๋ฐฐ์ก์ ๋ณด ์ ๋ ฅ,์์ ๋ถ๋ถ
- ์ฃผ๋ฌธ
- ์ฃผ๋ฌธ์ ์์ฑ
- ์ฃผ๋ฌธ ๋ด์ญ ๋ฆฌ์คํธ ( ์ฃผ๋ฌธ ๋ด์ญ, ์์ฃผ ์ฌ๋ ์ํ )
- ์ฃผ๋ฌธ ๋ด์ญ
- ์ฃผ๋ฌธ ๋ด์ญ ์์ธ
- ์ฃผ๋ฌธ ์์ธ ๋ถ๋ถ
- ์์ฃผ ์ฌ๋ ์ํ
- ์ฃผ๋ฌธ ํ ๊ฒฐ๊ณผ ํ๋ฉด
- ์ฅ๋ฐ๊ตฌ๋
- ํ
- ์ปฌ๋ฆฌ์ถ์ฒ ํ๋ฉด ( ์ํ ๋ฆฌ์คํธ )
- ํ์ด๋จธ ๊ธฐ๋ฅ ๊ตฌํ
- ์ ์ํ
- ๋ฒ ์คํธ
- ์๋ฐ์ผํ
- ํน๊ฐ/ํํ
- ์ปฌ๋ฆฌ์ถ์ฒ ํ๋ฉด ( ์ํ ๋ฆฌ์คํธ )
- ์นดํ ๊ณ ๋ฆฌ
- ๊ฒ์
- ๊ฒ์ ์ฒซ ํ๋ฉด
- ๊ฒ์์ด๋ฅผ ์ ๋ ฅ๋ง ํ์ ๋ ๋ํ๋๋ ๊ฒ์ ๋ฆฌ์คํธ
- ๊ฒ์์ด๋ฅผ ์ ๋ ฅ ํ ๋ํ๋๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ
- ์ํ ์์ธํ์ด์ง
- ์ํ์ค๋ช
- ์ํ์ ๋ณด
- ์ํ ์ ํ (๊ตฌ๋งคํ๊ธฐ ๋๋ฅด๋ฉด ๋ํ๋จ )
- ์ํ ํ๊ธฐ
- ํ๊ธฐ ๋ณด๊ธฐ
- ์ํ ๋ฌธ์ํ๊ธฐ
- ๋ฌธ์ ์์ฑํ๊ธฐ
- ์ฟ ํฐ
- ์ฟ ํฐ ๋ค์ด๋ก๋
- ์ฟ ํฐ ๋ฑ๋ก
- ์ฟ ํฐ ๋ด์ญ
- ์ด๋ฒคํธ
- ์ด๋ฒคํธ ๊ตฌํ ํ๋ฉด
- ์ ๋ฆฝ๊ธ ๋ด์ญ
API
ํ์๊ฐ์ POST
์ ์ฒด์ ์ ์กฐํ GET
ํน์ ์ ์ ์กฐํ GET
๋ก๊ทธ์ธ POST
์ ์ ์ ๋ณด๋ณ๊ฒฝ PATCH
ํ์ ํํด PUT
์ด๋ฉ์ผ๋ก ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ GET
์ ํ๋ฒํธ๋ก ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ GET
์๋ก์ด ๋น๋ฐ๋ฒํธ ๋ง๋ค๊ธฐ PATCH
๋ฐฐ์ก์ง ์ถ๊ฐํ๊ธฐ POST
๋ฐฐ์ก์ง์กฐํ GET
ํน์ ๋ฐฐ์ก์ง์กฐํ GET
๋ฐฐ์ก์ง์์ PATCH
๋ฐฐ์ก์์ญ์ DELETE
๋ด ์ฐ ๋ชฉ๋ก ์กฐํ GET
์ฐํ๊ธฐ POST
์ฐ์ญ์ DELETE
๋ ๋ฒจ์กฐํGET
๊ฐ๋ณ๋ ๋ฒจ GET
์ด๋ฒคํธ์กฐํ GET
์ด๋ฒคํธ์ฐธ๊ฐ GET
์ฌ์ฉ์์ฟ ํฐ ์กฐํ GET
์ฌ์ฉ์์ฟ ํฐId๋ฑ๋ก GET
์ฟ ํฐ์กฐํ GET
์ ๋ฆฝ๊ธ์กฐํ GET
์ฅ๋ฐ๊ตฌ๋ ์์ฑ POST
์ฅ๋ฐ๊ตฌ๋ ์กฐํ GET
์ฅ๋ฐ๊ตฌ๋ ์ญ์ DELETE
๊ฒฐ์ ์ ๋ณด GET
์ฃผ๋ฌธ POST
์ฃผ๋ฌธ๋ด์ญ์กฐํ GET
์ฃผ๋ฌธ ์์ธ๋ด์ญ ์กฐํ GET
์ํ์ชฝ API๊ฐ ๊ณ์ ์์ ๋์ด ์ต์ข ๋ณธ์ด ๋๋ฌด ๋ฆ๊ฒ๋์์ต๋๋ค. ๋, ๋ค๋ฅธ ์ฐ๊ด๋ API์ ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ๋ง์ง ์๊ฑฐ๋ M์ด ํ์๋์ด์๋ ๊ณณ์ null์ด ๋ค์ด๊ฐ๋ ๋ฑ ์ด์๋ค์ด ๋ง์ด ๋ฐ์ํ์ฌ ์ํ์ชฝ๊ณผ ์ฐ๊ด๋ ์ฑ ๊ฐ๋ฐ์ ์ง์ฐ์ด ์์์ต๋๋ค. ๋, ์ํต์ ์ค๋ฅ๋ก ํ๊ฐ์ API๋ก ์กฐํํ ์ ์๋ โ์ฃผ์ ๋ณ ์ํ๋ค ์กฐํโ๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํ์ฌ ๊ทธ ๋ถ๋ถ์ ๊ฐ์ด ํด๊ฒฐํ๋๋ฐ ์๊ฐ์ ๋ ์์ํ์ฌ ์์ ์ ์งํ์ด ๋๋์ด์ก์ต๋๋ค.
์ ์ฒด ์์ดํ ์กฐํ GET
์์ดํ ์กฐํ(+๊ฒ์) GET
์นดํ ๊ณ ๋ฆฌ ๋ฆฌ์คํธ GET
๊ณต์ง ์ฌํญ GET
์นดํ ๊ณ ๋ฆฌ์ ์กด์ฌํ๋ ์ํ๋ค GET
์์ ์์ดํ ์นดํ ๊ณ ๋ฆฌ ์กฐํ GET
์นดํ ๊ณ ๋ฆฌ๋ณ ์์ดํ ๋ชฉ๋ก ์กฐํ GET
์ํ ๋ํ ์ผ GET
์ ์์์ดํ ๋ชฉ๋ก GET
๋ฒ ์คํธ ์์ดํ ๋ชฉ๋ก GET
์๋ฐ์ํ ์ํ๋ฆฌ์คํธ GET
๋ฎ์ ๊ฐ๊ฒฉ ์ ์ํ๋ฆฌ์คํธ GET
๋์ ๊ฐ๊ฒฉ ์ ์ํ๋ฆฌ์คํธ GET
์ ์ฒด ์ํ์ค๋ช ์กฐํ GET
์ํ์ค๋ช ์กฐํ GET
์ฃผ์ ๋ณ API GET
์ฃผ์ ๋ณ API ์ ์ฒด GET
์ด๋ฉ์ผ๋ก ์์ด๋์ฐพ๊ธฐAPI - ๋ง๋์๊ธฐ์ ์ ์ด๋ฏธ ๋ค๋ฅธAPI ์ฎ์ด์ ์ด๋ฏธ ๊ตฌํํจ
์ ํ๋ฒํธ๋ก ์์ด๋์ฐพ๊ธฐ API - ๋ง๋์๊ธฐ์ ์ ์ด๋ฏธ ๋ค๋ฅธAPI ์ฎ์ด์ ์ด๋ฏธ ๊ตฌํํจ
์๋ฆผ์ค์ ์กฐํ - ํ๋ฐํธ์์ UserDefault๋ก ๊ตฌํ
๊ฒฐ์ ์ ๋ณด ์์ฑ API - ๋ง๋ค๋๋ง ํฌ๋งจ์์ ์ฌ์ฉํ๊ณ ํ๋ฐํธ์์ ์ฌ์ฉํ ํ์๊ฐ ์์
๋ ๋ฒจ์์ฑAPI - ๋ง๋ค๋๋ง ํฌ๋งจ์์ ์ฌ์ฉํ๊ณ ํ๋ฐํธ์์ ์ฌ์ฉํ ํ์๊ฐ ์์
์ด๋ฒคํธ์์ฑ API - ๋ง๋ค๋๋ง ํฌ๋งจ์์ ์ฌ์ฉํ๊ณ ํ๋ฐํธ์์ ์ฌ์ฉํ ํ์๊ฐ ์์
์ฟ ํฐ ๋ฑ๋ก API - ๋ง๋ค๋๋ง ํฌ๋งจ์์ ์ฌ์ฉํ๊ณ ํ๋ฐํธ์์ ์ฌ์ฉํ ํ์๊ฐ ์์
์ ์ฒด ์ฟ ํฐ ์กฐํ API - ํ์ธ์ฉ์ผ๋ก ํฌ๋งจ์์ ์ฌ์ฉ
๊ฐ๋ฐ์ผ์ง
-
๊ธฐํ์ ์์ฑ ๋ฐ ์ ์ถโฃ - 100% ( ํผ๋๋ฐฑ ๋ฐ์)
-
์ง์ผ์ผํ ์ฌํญ1์ฐจ ํผ๋๋ฐฑ ์ , ์ต์ํ ์งํํด์ผํ ์ฌํญ๋ค - ๋ก๊ทธ์ธ / ํ์๊ฐ์ - ํํ๋ฉด ์ฒซํ๋ฉด - ๋ด์ ๋ณด ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ UI ์ด์๊ฐ ์๊ธด๋ค๋ฉด, ๋ฐ๋ก ๋ง์ํด์ฃผ์ธ์. ์ถ๊ฐ๋ก, iOS ๋ผ์ด์งํ ์คํธ ํ๋ก์ ํธ ๊ตฌ์ฑ ๊ณ ๋ ค์ฌํญ์ ๋๋ค. ## UI 1. UI๋ Storyboard base ์ด๊ตฌ์. ๋ถ๋ถ์ ์ผ๋ก Code ํน์ Xib ์ฌ์ฉ์ ๊ฐ๋ฅํฉ๋๋ค. 2. ์คํ ๋ ์ด์์ ์งํ ์, ์ต์ 2 ๊ธฐ๊ธฐ ํ์ธํ์ ์, ๋ ์ด์์ ์๋ฌ ํ ๋ฒ์ฉ ์ฒดํฌํด์ฃผ์ธ์. (์ถ์ฒ๋๋ฆฌ๋ ๊ธฐ๊ธฐ๋ "iPhone 8" , "iPhone 13 Pro Max" ์คํ์ ํตํด ๋น๊ตํด๋ณด์ธ์) 3. ์ฑ ์์ด์ฝ์ ์ถ๊ฐํ์ง ์์๊ฒ์. 4. ๋คํฌ๋ชจ๋๋ ๊ณ ๋ คํ์ง ์๊ณ LightMode ๊ณ ์ ์ ๋๋ค. ## ํ๋ก์ ํธ ๊ตฌ์ฑ ๋ง์ฝ ์ํคํ ์ณ ํจํด์ ์ฉํ์ ๋ค๋ฉด, ํด๋น ๋ถ๋ถ ๋ง์ํด์ฃผ์ธ์. ex) MVC / MVP / MVVM ... etc ๊ธฐ๋ณธ์ ์ผ๋ก๋ MVC๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ฒ ์ต๋๋ค. ## ๋ผ์ด๋ธ๋ฌ๋ฆฌ Rx ํน์ Combine์ ์ฌ์ฉํ์ง ์๊ฒ ์ต๋๋ค. ## ๋คํธ์ํฌ Network Layer๋ 5์ฃผ์ฐจ ์์ ๊ทธ๋ฆฌ๊ณ ํฌํ๋ฆฟ์ ์๋ ๊ฒ์ฒ๋ผ Request ํด๋์ค๋ฅผ ํตํด์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ฃผ์ธ์. ์ ์ฌํญ๋ค์ด ์ด๋ ต๊ฒ ๋ฐ์๋ค์ด์ค ์๋ ์๋๋ฐ, ์ง๊ธ๊น์ง ํด์ค์ ๋ฐฉํฅ์ผ๋ก ์งํํ์ ๊ฒ๋ค์ ๊ธ๋ก ์์ฑํ ๊ฒ ๋ฟ์ ๋๋ค. ํน์ ์ง๋ฌธ ์์ผ์๋ฉด ์ง๋ฌธ์ฃผ์ธ์~!
-
-
์๋ฒ์ ํ์์งํ
-
README - ๊ฐ๋ฐ์ผ์ง ๋งํฌ ์ฐ๊ฒฐ -
๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ถgitignore file ์ถ๊ฐ๋คํธ์ํฌ ํต์ , ์ด๋ฏธ์ง ์บ์ฑ์ ์ํด Alarmofire, Kingfisher pod installํด๋๊ตฌ์ฑ, ๊ธฐ์ด ์์ ์๋ฃ๊ธฐ๋ณธ UI ์์ ํ๋จ ์๋ฃ
-
UI๋ก๊ทธ์ธ ๊ตฌํ ์๋ฃ - 100 %๋ง์ด์ปฌ๋ฆฌ ๋นํ์ ๊ตฌํ ์๋ฃ - 100 %
-
์๋ฒ์๋ฒ๊ฐ ์ค ๋ก๊ทธ์ธ ํ์๊ฐ์ API Postman์์ ํ ์คํธ - ์๋ฃ
ํ ํ๋ฉด ์ปฌ๋ฆฌ์ถ์ฒ - 90% ๊ตฌํ ์๋ฃ โ 100% (MD ๋นผ๊ธฐ๋ก ํจ)ํํ๋ฉด ํ์ด์ง๋ทฐ ๊ตฌํ ์๋ฃ์ด๋ฒคํธ ๋ฐฐ๋ ์๋ ํ์ด์ง ๊ตฌํ ์๋ฃ์ํ - ์ฌ๋ฌ ์ ๋ก ๋๋์ด ๊ตฌํ ์๋ฃ- MD ์ถ์ฒ ๋ถ๋ถ์ ๊ตฌํ ์ํ๊ธฐ๋ก ๊ฒฐ์
๋ง์ด์ปฌ๋ฆฌํ์๊ฐ์ UI ๊ตฌํ 100%์์ด๋์ฐพ๊ธฐ UI ๊ตฌํ 100%๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ UI ๊ตฌํ 100%ํ์์ผ๋ UI ๊ตฌํ 100%
์๋ฒ์ ํ์์งํ
-
1์ฐจ ํผ๋๋ฐฑ -
ํ ํ๋ฉด์ปฌ๋ฆฌ์ถ์ฒ UI ๊ตฌํ 100%์ ์ํ UI ๊ตฌํ 100%๋ฒ ์คํธ UI ๊ตฌํ 100%์๋ฐ์ผํ UI ๊ตฌํ 100%ํน๊ฐ/ํํ UI ๊ตฌํ 100%
-
๋ง์ด์ปฌ๋ฆฌ๋ก๊ทธ์ธ, ํ์๊ฐ์ API ๋ถ๋ถ ์ฐ๋ ํ ํ ์คํธ ์๋ฃ 100% -
๋ฆฌํฉํ ๋ง๋ฆฌํฉํ ๋ง๊ธฐํ ์ถ๊ฐ๋ก ํผ๋๋ฐฑ ํ ์ ์ฒด ๋ฆฌํฉํ ๋ง ์งํ -
์๋ฒ์ ํ์์งํ
-
๋ค๋น๊ฒ์ด์ ๋ฒ๊ทธ ์์ -
๋ฆฌํฉํ ๋ง ์์ -
๋ง์ด์ปฌ๋ฆฌ๋ถ๋ถ ํด๊ฒฐ -
์๋ฒ์ ํ์์งํ -
ํ์์ชฝ API ์ฐ๋ ํ ํ ์คํธ - ok- ์๋ฌ
- 400 : url ์๋ชป์ด๊ฑฐ๋ ์ธ์ฝ๋ฉ๋ฌธ์ https://medium.com/@jakoriaty/alamofire-400-error-๋ฌธ์ -9ca84c498e38
- 415 : "Unsupported Media Type" ์ค๋ฅ http://daplus.net/java-json์์-http-415-์ง์๋์ง-์๋-๋ฏธ๋์ด-์ ํ-์ค๋ฅ/
let para: SignUpRequest = SignUpRequest(username: "test333e", email: "[email protected]", password: "111", phone_number: "asdfa",birth: nil, gender: nil) signUpManager.requestSignUp(parameter:para){ response in print("djakfs->\(response)") }
- ์๋ฌ
์๋ฒ์์ ํ์- ๊ฒ์ํ๋ฉด
๊ฒ์์ฐฝ ์ง์ ๊ตฌํ ( ์ปค์คํ ํ์ ) 100%๊ฒ์ ์ด๊ธฐํ๋ฉด UI ๊ตฌํ 100%๊ฒ์์ด๋ฅผ ์ ๋ ฅํ์ ๋ ๋ํ๋๋ ๊ฒ์๋ฆฌ์คํธ ํ๋ฉด UI ๊ตฌํ 100%๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ํ๋ฉด UI ๊ตฌํ 100%๊ฒ์๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒฝ์ฐ UI ๊ตฌํ 100%๊ฒ์๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒฝ์ฐ UI ๊ตฌํ 100%
- API ๋ถ๋ถ
์๋ฒ์์ ๋์จ ๋ช ์ธ์๋ฅผ ํ ๋๋ก Postman์์ ํ ์คํธ ์งํํจ
์๋ฒ์์ ํ์- ์นดํ
๊ณ ๋ฆฌ ํ๋ฉด
์นดํ ๊ณ ๋ฆฌ ๋ฆฌ์คํธ - ์ ๋ฌผํ๊ธฐ ๋ถ๋ถ ์๋ฃ์นดํ ๊ณ ๋ฆฌ ๋ฆฌ์คํธ- ์นดํ ๊ณ ๋ฆฌ๋ณ ์์, ํ์ ๋๋์ด ํ ์ด๋ธ ํ์ฅํ๋๋ก ๊ตฌํ์นดํ ๊ณ ๋ฆฌ ๋ฆฌ์คํธ - ์ปฌ๋ฆฌ์ถ์ฒ ๋ถ๋ถ ์๋ฃ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ ํํ์ฌ ํด๋น ์นดํ ๊ณ ๋ฆฌ์ ๋ํ ์ผ ํ๋ฉด์ผ๋ก ์ด๋ ์๋ฃ
- ์๋ฒ
๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃํ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ์์ด๋ ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ์ ์ฒด ์ ์ ์กฐํ API ์ฐ๋ํน์ ์ ์ ์กฐํ API ์ฐ๋์ ์ ์ ๋ณด ์์ API ์ฐ๋
์๋ฒ์์ ํ์API ์์ ํ ๋ก๊ทธ์ธ ์ต์ข ์๋ฃAPI ์์ ํ ํ์๊ฐ์ ์ต์ข ์๋ฃAPI ์์ ํ ์์ด๋ ์ฐพ๊ธฐ ์ต์ข ์๋ฃ
๋ก๊ทธ์ธํ ๋ jwt๋ก userDefault๋ก ์ ์ฅํ๋ฉด์ ์ฐ๊ธฐ ( ๋ค๋ฅธ ๋ฐฉ๋ฒ: keychain )
์๋ฒ์์ ํ์๊ณต์ ํ๋ ํ๋ฉด ๊ตฌํ ์๋ฃ์ํ ์ ํ ํ๋ฉด - ์๋ stepperGMStepper
๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ์์ดํ ์์ธํ์ด์ง ์ํ์ค๋ช ๊ตฌํ ์๋ฃ์ํ ์ ํ ํ๋ฉด ๊ตฌํ ์๋ฃ๋น๋ฐ๋ฒํธ์ฐพ๊ธฐ ๊ตฌํ ์๋ฃ
์ฃผ์ ๋ณ API, ์ ์ฒด ์ํ ์กฐํ API, ํน์ ์ํ ์กฐํ API .. ๋ฑ API ๊ตฌ์กฐ ์ง์ ์๋ฒ์๊ฒ ์ ๋ฌ์๋ฒ์์ ํ์์๋ฒ์์ ์์ฑํ API ๊ณ์ ๋ด์ฃผ๊ธฐ(์คํฐ๋ธ)์๋ฒ์์ ์์ ํ API ํ ์คํธํด์ฃผ๊ธฐ ( ์๋ฆฌ )ํ์ ) ์๋ฆฌ๋๊ณผ ๋ฐฐ์ก์ง ๊ด๋ จ ๋ถ๋ถ ์์ ์ฌํญ ๋ง์๋๋ฆฌ๊ธฐ
๋ค๋น๊ฒ์ด์ ์๋จ์ ๋ฐ๋ฒํผ ์์ฑ ํ ๊ฐ๊ฒฉ ์กฐ์
2์ฐจ ํผ๋๋ฐฑ์๋ฒ์์ ํ์ํ ์คํธํ๋๊ฐ ์๋ ๊ณณ์ ํ๋ฉด ํฐ์นํ์ ๋ ๋ด๋ ค๊ฐ๋๋ก ๊ตฌํํ๊ธฐ์์ดํ ์์ธํ์ด์ง๋ก ์ด๋ํ ๋ ์์ผ๋ก ์ด๋ํ๋ ๊ฑฐ ํด๊ฒฐ๋ฐฐ์ก์ง๋ฐฐ์ก ์ ๋ณด ์ ๋ ฅํ๋ ๋ถ๋ถ ํ๋ฉด์ด ๋ณต์กํด์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆผ - ๊ตฌํ ์๋ฃ- scrollView์ ๋์ด๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์๋ stackView๋ฅผ ์ฌ์ฉํ์
- ๊ณต๋ํ๊ด ์ถ์ ๋ฐฉ๋ฒ์ ์๋ตํ๊ณ ๋์ค์ ์์ ํ์
์ฃผ๋ฌธ์ฃผ๋ฌธ๊ฒฐ๊ณผ์ฃผ๋ฌธ๋ด์ญ์ฃผ๋ฌธ๋ด์ญ ๋ฆฌ์คํธ์์ฃผ์ฌ๋์ํ ๋ฆฌ์คํธ์์ฃผ์ฌ๋ ์ํ์ผ๋ก ํ๋ฉด ์ด๋
์ฃผ๋ฌธํ๋ฉด
๋ฐ์ ์ด์ ํด๊ฒฐ๋ฐ์์ด์ ํด๊ฒฐ : ํ๋ฉด ์ ํ์ ๋ค๋น๊ฒ์ด์ ํ๋ฉด ์ ํ ํจ๊ณผ์ ์ ํ ํ ์์ ๋ณ๊ฒฝ ๋ฑ๋ฐ์์ด์ : ์ฃผ๋ฌธ๋ด์ญ์์ xlpagertabstrip ์ ์ฉ์ด ์๋จ ( ์ด์ ๋ฅผ ์์ง๋ ๋ชจ๋ฅด๊ฒ ์ )๋ฑ, ๋ง์ด์ปฌ๋ฆฌํ์ด์ง โ ์ฃผ๋ฌธ๋ด์ญ์ผ๋ก ๊ฐ๋๋ง ์๋๊ณ๋ค๋ฅธ๊ณณ์์ ์ด๋ํด๋ ๊ทธ๋ฌ๋์ง ๋ดค๋๋ฐ ๊ทธ๋๋ ์ ์ฉ์ด ์๋จ๋ฐ๋ผ์, ์ด ๋ถ๋ถ์์ ์ฝ์ง์ ์ค๋ํ๊ณ ์๋๋ค๋ ๊ฒ์ ์ ํ ๋ฒํผ์ ํตํ ์ปจํ ์ด๋๋ทฐ๋ก ์์ ํ์
-
์๋ฒ์์ ํ์ - ์ง๋ฌธ ๋ด์ฉ ์ ๋ฌ, ํ ์ํฉ ๋ฃ๊ธฐ-
์๋ฆฌ๋ : ์ฟ ํฐ ๋ถ๋ถ, ์ด๋ฒคํธ ๋ถ๋ถ
- ์ด๋ฏธ์ง๋ง ๋์ฐ๋ฉด ๋จ - ์ปฌ๋ฆฌ ํผํ ๋ฐ์ค, ์ปฌ๋ฆฌ ์๊ฐ, ์ปฌ๋ฆฌํจ์ค, ๋ฐฐ์ก์๋ด, ๊ฐ์ ํํ๋ณด๊ธฐ ( ํ๋ฐํธ์์ ์์ )
- ์ฟ ํฐ API ๋ง๋ค์ด๋ฌ๋ผํ๊ธฐ ok
- ๋ฌด๋ฃ๋ฐฐ์ก, 3000์ ํ ์ธ, 10000์ ํ ์ธ
- ์ฟ ํฐ์ด๋ฆ : [๋ฌด๋ฃ๋ฐฐ์ก] 3000์ ํ ์ธ ์ฟ ํฐ
- ์ฟ ํฐ์ค๋ช : 20000๋ง์ ์ด์ ์ฃผ๋ฌธ์ 3000์ ํ ์ธ ์ฟ ํฐ
- ๋ง๋ฃ์ผ : ์๋ฌด๋ ๊ฒ๋ ์ ํด์ฃผ์ธ์! ( ๋ ์ง + ์๊ฐ )
- ํ ์ธ์จ : 3000 ( Int๋ก ๊ณ ์ )
- ์ฟ ํฐ์์ด๋ : 10
- 5000์ ํ ์ธ
- ์ฟ ํฐ์ด๋ฆ : ์ ์ํ์ ๋ชจ๋ ์ ์ฉ๊ฐ๋ฅ 5000์ ํ ์ธ ์ฟ ํฐ
- ์ฟ ํฐ์ค๋ช : ์ฒซ ๊ฐ์ ์์๊ฒ ์ฃผ๋ ํํ์ผ๋ก์จ ์ ์ํ ์ ์ฉ๊ฐ๋ฅํ ์ฟ ํฐ
- ๋ง๋ฃ์ผ : ์๋ฌด๋ ๊ฒ๋ ์ ํด์ฃผ์ธ์! ( ๋ ์ง + ์๊ฐ )
- ํ ์ธ์จ : 5000 ( Int๋ก ๊ณ ์ )
- ์ฟ ํฐ์์ด๋ : 11
- 10000์ ํ ์ธ
- ์ฟ ํฐ์ด๋ฆ : [ ์ฑ์ ํ์ ์ฟ ํฐ ]ํ๋ ์ ์ฑ์
- ์ฟ ํฐ์ค๋ช : ์ด ์ฟ ํฐ์ ํ์ ์ฑ์ ์ํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ง๋ฃ์ผ : ์๋ฌด๋ ๊ฒ๋ ์ ํด์ฃผ์ธ์! ( ๋ ์ง + ์๊ฐ )
- ํ ์ธ์จ : 10000 ( Int๋ก ๊ณ ์ )
- ์ฟ ํฐ์์ด๋ : 12
- ์ฟ ํฐ ์ฌ์ฉํ์ ๋ ์ญ์ ๋ ๊ฐ๋ฅํด์ผํ ๊ฒ ๊ฐ์
- ๋ฌด๋ฃ๋ฐฐ์ก, 3000์ ํ ์ธ, 10000์ ํ ์ธ
- ์ค๋ ํน๊ฐ โ ์ฟ ํฐ ์์ฑ
- ์ฐํ์ํ ์ญ์
-
์คํฐ๋ธ : ์ํ API ์์
์ํ์ ๋ฑ๋ก๋์ด์๋ coupon_name์ ํ์ ์ Int๋ก ๋ณ๊ฒฝ ( ์ฟ ํฐId๊ฐ ํ์ ) - coupon id๋ก ๋ณ์๋ช ๋ณ๊ฒฝ, ํ์ Int๋ก ์์ ๊ฐ์ด ์ฟ ํฐ์ด ์๋ ์ํ์ ์ด๋ค ์ฟ ํฐ์ ๋ฃ์์ง ์๊ธฐ๋๋๊ธฐ์ฐํ ๋ชฉ๋ก์ ์์ดํ ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ์ผ๋์ ์๋ฆฌ๋๊ณผ ์๊ธฐ๋๋ ๋ณด๋ผ๊ณ ๋ง์๋๋ฆฌ๊ธฐ๋ฎ์ ๊ฐ๊ฒฉ์, ๋์ ๊ฐ๊ฒฉ์ ์ ๋ ฌ๊ธฐ์ค์ด originPrice๊ฐ ์๋๋ผ discountPrice์ด๋ค. - ์์ ์๋ฃํน๊ฐ์ํ ํน๊ฐ์์์ผ๋ง ์์ฑํด์ฃผ์๊ธฐ๋ก
-
-
10์๊น์ง ์ฃผ๋ฌธ์์ธ ๋ง๋ค๊ธฐ -
์ฃผ๋ฌธ ์ ๋๋๊ธฐ -
์ฟ ํฐ
์ด๋ฒคํธ์์ ์ฟ ํฐ ๋ค์ด๋ก๋๋ฅผ ๋๋ ์ ๋ ํ๋ฉด ๊ตฌํ์ฟ ํฐ๋ค์ด๋ก๋์ฟ ํฐ๋ฑ๋ก ์๋ฆผ์ฐฝ ๊ตฌํ์ฟ ํฐ๋ด์ญ ๋ณด์ฌ์ฃผ๊ธฐ ํ๋ฉด ๊ตฌํ- ์ฟ ํฐ ๋ฒํผ ๋๋ ์ ๋ ๋ฐ๋ก ๊ตฌํ ( ํ๋ฉด ์ด๋๋ง ํ๋ฉด ๋ ๋ฏ )
-
์ด๋ฒคํธํ๋ฉด ( ํน๊ฐ/ ํํ )ํน๊ฐ/ํํ์ ์ด๋ฒคํธ ์์ธํ๋ฉด ๊ตฌํ
-
์ ๋ ฌํ๋ ๋๋กญ๋ฐ์ค ๊ตฌํ -
๋ฐฐ์ก์ง ์ ํ ํํ ๋ชจ๋ฌ pod 'MaterialComponents/BottomSheetโ -
ํ์ด๋จธ๊ตฌํ-
์๋ฒ์์ ๋ฐ์์จ ํน๊ฐ ์ํ ์ค ํน๊ฐ์์๋ ์ง๊ฐ ์ค๋๋ ์ง์ ๋์ผํ๋ค๋ฉด ์ค๋ ๋ ์ง์์ ๋จ์ ์๊ฐ์ ํ์ํ๊ธฐ + ํด๋น ๋ ์ง์ ํน๊ฐ ์ํ ๋์ฐ๊ธฐ -
๋ง์ฝ 10๋ถ ์ดํ๋ก ๋จ์์ ๊ฒฝ์ฐ ๋นจ๊ฐ์์ผ๋ก ๋์ -
์๊ฐ์ด ์ง๋ฌ์ผ๋ฉด ๋ง๋ฃํ์ํ๊ณ ํ์ด๋จธ ์ ์ง
-
-
๋ฐ์น์คํฌ๋ฆฐ -
์ฃผ๋ฌธ ๋ด์ญ ์์ธ์์ ๋ฐฐ์ก ์กฐํ๋ฅผ ๋๋ ์ ๋ ์น์ฌ์ดํธ๋ก ์ฐ๊ฒฐ -
์ฐํ ์ํ
-
์๋ฒ๋ถ๋ค๊ณผ ํ์์ง๋ฌธ ์ฌํญ ๋ชจ๋ ์ฌ์ญค๋ณด๊ธฐ์๋ฆฌ๋๊ณผ ํ์- ์ ๋ฆฝ, ์ฐ ๋ถ๋ถ
์คํฐ๋ธ๋๊ณผ ํ์- ์นดํ ๊ณ ๋ฆฌ
- API ์ต์ข ๋ณธ์ด ์ธ์ ๋์ค๋์ง ์ฌ์ญค๋ณด๊ธฐ ( ๋์ถฉ ์ผ์ ์ด๋ผ๋ )
-
์๋ฆผ์ค์ ๊ฑฐ๋ถ, ๋์ ์ ๋์ค๋ฉด ํ์ ์ฐฝ ( ์์์ ๋ณ๊ฒฝ ๋ชปํจ )
-
์น๊ตฌ์ด๋, ๋ฐฐ๋ ์ด๋, -
์ ์ฒด๋ฑ๊ธ ๋ณด๊ธฐ, ๋ค์๋ฌ ์์๋ฑ๊ธ ๋ณด๊ธฐ -
์ ๋ฌผ๋ด์ญ ํ - ์ ๋ฌผ๋ด์ญ์ ์ ๋ฌผ ๋ฐ๊ณ ๋ ํ ์ด๋ค ํ๋ฉด์ธ์ง ๋ชฐ๋ผ์ ์์๋ ํ๋ฉด์ ๋ง๋ค์์ต๋๋ค. -
๊ฐ๊ฒฉ์ ์ฝค๋ง ์ ์ฉํ๋ ๊ฑฐ ์ฐพ๊ธฐ -
์ทจ์์ ํ์ -
์ ๋ฆฝ๊ธ -
๊ฐ์ ํํํ๋ฉด ๊ตฌํ -
์ปฌ๋ฆฌ์๊ฐ -
๋ฐฐ์ก์๋ด -
๊ณต์ง์ฌํญ -
๊ณ ๊ฐ์ผํฐ -
1:1 ๋ฌธ์(๋ค๋น๋ถ๋ถ ์์ ์๋ฌ์ง๋ง ), ๋ฌธ์ ์์ฑ -
์ด์ฉ์๋ด -
์ปฌ๋ฆฌ ํผํ๋ฐ์ค, ์ปฌ๋ฆฌํจ์ค -
API ์ฎ๊ธฐ ( ํ์ฌ ์์ฑ๋ API ์์ฃผ๋ก )์ ๋ ฌ๋ฆฌ์คํธ ๋ถ๋ถ : ์ ์ํ(์ ์ํ์), ๋ฒ ์คํธ(์ถ์ฒ์,ํ๋งค๋์), ์๋ฐ์ผํ(ํํ์), ๋์๊ฐ๊ฒฉ์, ๋ฎ์๊ฐ๊ฒฉ์๋ฆฌ์คํธ์์ ์ผํ์นดํธ ํด๋ฆญํ์ ๋ ๋ชจ๋ฌ๋ก ๋์ฐ๊ธฐ- ๋ฌธ์ : ์ ๋ ฌ ๋๋กญ๋ค์ด ์ ํํ๊ณ ๋์ ๋ฐ์ดํฐ์ด ๋ฐ๋๋ ์๊ฐ๋๋ฌธ์ ์์ค์ด ๋๊ฑฐ๋, ๋๋ฆผ
๊ณต์ง์ฌํญ API ์ฎ์
ํ์ ๋ฐ์ดํฐ ์ค๊ณ ( UserInfoManager )์ฌ์ฉ์ ๋ฑ๊ธ ์กฐํ API ์ฐ๋ํ์ ์ ๋ณด ๋์ฐ๊ธฐ๋ฑ๊ธ ๋์ฐ๊ธฐ์ฟ ํฐ๊ฐฏ์ ๋์ฐ๊ธฐ
์ ์ฒด ์ด๋ฒคํธ ์กฐํ API ์ฐ๋์ฌ์ฉ์ ์ฟ ํฐ ๋ด์ญ ์กฐํ API ์ฐ๋์ฟ ํฐ ๋ด์ญ ์ถ๋ ฅํ๊ธฐ์ฌ์ฉ์ ์ฟ ํฐ id๋ก ๋ฑ๋กํ๊ธฐ API ์ฐ๋ ํ ํ๋ฉด ์ถ๋ ฅ ์๋ฃํน์ ์ฟ ํฐ ์ ๋ณด APIํน์ ์ฟ ํฐ ์ ๋ณด API ํ๋ฉด ๋์ฐ๊ธฐ์ด๋ฒคํธ์์ ์ฟ ํฐ ๋ค์ด๋ก๋๋ก๋ฉํ๋ฉด , ์ฃผ์ ๋ณ ์ ์ฒด ์กฐํ API ์ฐ๋์ฃผ์ ๋ณ ๋ฆฌ์คํธ ์ ์ฒด ์กฐํ โ count ๋ฐ์์ค๊ณ ๊ฑฐ๊ธฐ์ ์ฃผ์ ๋ณ ๋ฆฌ์คํธ์ ์ ๋ณด๋ค์ ์์ด๋๋ฅผ ์ด์ฉํด์์ฃผ์ ์ ์์ดํ ์กฐํ์์ดํ ๋ชจ๋ธ์ ๋ง๋ค์ด์ ๊ด๋ฆฌ ... - ๋ก๋ฉํ๋ฉด์์ ์์ ์ ์ด๋ฏธ ์์ํจ ( ItemInfoManager )ํํ๋ฉด ์ฃผ์ ๋ณ๋ก ๋์ฐ๋ ๋ถ๋ถ API ๋์๋ฉด ์ฐ๋ํด์ ๋์ฐ๊ธฐ์ํ ์์ธํ์ด์ง์ API ์ฐ๋ํด์ ๋์ฐ๊ธฐ์ ์ฒด ์นดํ ๊ณ ๋ฆฌ ์กฐํ์์ดํ ์์ธ ์ ๋ณด ์กฐํ ใ ๊ณต์ ํ๋ฉด์ํ ํ๊ธฐ ๋ชฉ๋ก, ์ํ ํ๊ธฐ ๋ณด๊ธฐ, ์ํ ๋ฌธ์ ๋ชฉ๋ก, ์ํ ๋ฌธ์ ์์ฑ๋ง์ด์ปฌ๋ฆฌ (์ํํ๊ธฐ) - ์์ฑ๊ฐ๋ฅํ๊ธฐ, ์์ฑ์๋ฃํ๊ธฐ
- ์๋ฒ์ชฝ์์ ๋๊ฐ์ ์๋ฒ๋ก ์์ ์ ํ๋ค๋ณด๋, ํฉ์น๋ ๊ณผ์ ์์ ์ค๋๊ฑธ๋ ค์ ์์ ์ ๋ชปํจ
- ์๋ฒ ๊ตฌ์ถ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ ๋ฐ์ดํฐ ์์ค๋๋ฌธ์ ๋์ฝ๋ฉ์ด ์๋๋ ์ํฉ
- ๋์ฝ๋ฉ์ด ์๋๋๊น ๋ค์ ํ๋ฉด์ผ๋ก ์๋์ด๊ฐ๊ณ ๋์์ ํ์ธํ ๋ฐฉ๋ฒ์ด ์์
- ๋ํ์ฅ ๋ง์ผ์ปฌ๋ฆฌ ์๋น์ค์ ๊ฒ..
์ฐ(์ฐํ๊ธฐ, ์ฐ์ญ์ ํ๊ธฐ, ์ฐ๋ด์ญ๋ณด๊ธฐ),๋ฐฐ์ก์ง ์ถ๊ฐ, ๋ฐฐ์ก์ง ์กฐํ, ํน์ ๋ฐฐ์ก์ง์กฐํ, ๋ฐฐ์ก์ง ์์ , ๋ฐฐ์ก์ง ์ญ์ ์ฐ๋
๊ฐ๊ฒฉ์ ์ฝค๋ง ๋ชจ๋ ์์ - API ์๋์ด
- ํ๋ฉด๋ง ๊ตฌํํจ. ์ฐ์ ์ฐ๋์ ๋ณด๋ฅ [๊ฐ์ธ์ ๋ณด ์์ (๋ณด๋ฅ), ๋๋์ฃผ๋ฌธ ๋ฌธ์(๋ณด๋ฅ), ํ๊ธฐ ๋ฌธ์(๋ณด๋ฅ)]
- ํ๋ฉด ๊ตฌํ ๋ชปํจ, API๋ ์๋์ด [ ์์ฃผํ๋ ์ง๋ฌธ ]
- ๊ฒ์API ์๋์ด
- ์นดํ ๊ณ ๋ฆฌ API ์ต์ข ์๋์ด
- ๊ธฐํ ์ํ๊ณผ ์ฐ๊ด๋ API ์กฐ๊ธ์ฉ ์์ ์ด ํ์ํ๋ฐ ์๊ฐ์ ์๋ ๊ฒ ๊ฐ์ ( ํ์ฌ ๋์จ API ์ฎ๋๊ฒ ์ฐ์ ์ธ ๊ฒ ๊ฐ์ )
๋ง์ผ์ปฌ๋ฆฌ ์๋น์ค์ ๊ฒ์๊ฐ + ์๋ฒ์๋จ ์์ ํ๊ธฐ๊ฐ ์ด๋ ค์ด ์ํฉ๋๋ณธ์ง๊ณ ์์์ฐ์ด์ ์ ์ถ - ์ ํ๋ธ- ์๊ฐ์ ๋๋ณธ ์ง์ง ๋ชปํด์ ๋ฐ๋ก ์์์ฐ์ด ์ ์ถ
ํ์๋ค๊ณผ ์๊ธฐ ๋์ ์ถ๊ฐ์์ ์ ํตํด ๋ง๋ฌด๋ฆฌ๋ฅผ ํ๊ธฐ๋ฃจ ๊ฒฐ์ - ํ๋ก์ ํธ ์์ ๋ ํ๊ธฐ
- ํ ๊น ๋ ํฌ ํ๊ธฐ
- ๋ฆฌ๋๋ฏธ ์์ฑํ๊ธฐ
-
์๋ฒ
์ฅ๋ฐ๊ตฌ๋ ์ญ์ ๋ถ๋ถ๋ง url ์ฃผ์ /app ์ด ์์์คํฐ๋ธ๋: ์์ดํ 1-3๋ฒ๊น์ง๋ฐ์ ์๋๋ฐ ๋๋จธ์ง๋ ๋ณต๊ตฌ ๋ถํ๋๋ฆฝ๋๋น๊ทธ๋ฆฌ๊ณ ์์ดํ ์ฟ ํฐ๋ ๋ฆฌ์คํธ์์๋๋ฐ, ์ํ๋ค์ด๊ฐ๋ฉด ์์ด์ฉ ( ๋ง์ถฐ์ฃผ์ธ์ )์นดํธ์ ๋ด์ ์์ดํ ์ ๋ณด๋ค์ด ํ๋ฆฝ๋๋ค !
-
๋ฐฐ์ก์ง ๊ด๋ จ ๋ถ๋ถ ๋ชจ๋ ๋ง๋ฌด๋ฆฌ -
์ฅ๋ฐ๊ตฌ๋ ๊ด๋ จ ๋ถ๋ถ ๋ชจ๋ ๋ง๋ฌด๋ฆฌ- ์ฅ๋ฐ๊ตฌ๋ ์ญ์ ๋ถ๋ถ๋ง url ์ฃผ์ /app ์ด ์์
-
์ฃผ๋ฌธ -
์ ๋ฆฝ๊ธ -
CartViewController โ CellContent์ด ๋ถ๋ถ Nil์ด ์์ ๋๋ฉด ๋ฐ๊ฟ์ผ๋จ - ์์ ๋จif target.getItemRes.discount_rate != nil { } else { }
-
์ ๋๋ ์๋ ํ์์ผ๋ก ํ์ โ cell.selectionStyle = .none ์ผ๋ก ๋ชจ๋ ์์ -
์ฐํ ์ํ - ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ์์ - ๋ฏธ๊ตฌํ -
๋ฐฐ์ก์ง ์๋ก ๋ฑ๋กํ ๋ ์ฃผ์๊ฒ์์ ํด๋นํ๋ ๋ถ๋ถ์ ์์๋ก ํ๋ฉด ์์ ํ์ โ ์ถํ ์นด์นด์ค API๋ก ํ ์์
-
๋ง์ผ์ปฌ๋ฆฌ ์์ด์ฝ ๋ง๋ค๊ธฐ
-
์ฅ๋ฐ๊ตฌ๋ ์ฝ๊ฐ ์์ ์ด ํ์ ( ํ์์ )
-
๊ฒ์์ด๋ฅผ ํด๋ฆญํ์ ๋ ์์ธํ์ด์ง๋ก ์ด๋
๋ฐ์์ด์ ํด๊ฒฐ
ํ์ฌ ์ ์ฒด ํ์ ์กฐํ API ์๋จ- ์์ฃผํ๋ ์ง๋ฌธ ์ ๋ณด๋ง ๋ถ๋ฌ ์ฌ ์ ์๊ฒ ๋ง๋ค๊ธฐ ( x )
๊ณต์ง์ฌํญ ์ ๋ชฉ, ๋ ์ง๋ง ( ๋ด์ฉ๊น์ง ํ์์์ )์ ์ํ, ๋ฒ ์คํธ, ์๋ฐ์ผํ API - ๊ธฐ์ค ์ก์์ ๋ง์ํด์ฃผ์๊ธฐ์ถ์ฒ์, ๋์๊ฐ๊ฒฉ์, ๋ฎ์๊ฐ๊ฒฉ์.. ๋ฑ ์ ๋ ฌ ๋ถ๋ถ๋๋ฏธ๋ฐ์ดํฐ ๋ง์ด ์์ฑ - ์๊ฐ์ ์๋ ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ์ฃผ์ ๋ณ๋ก ๋ฐ์ดํฐ ๋ฃ์ด์ - 4-5๊ฐ๊ฐ ํ๊ณ์ผ ๊ฒ ๊ฐ์์๋ฒ ํฉ์น๊ธฐ - 5~6์๊ฐ์งธ ๊ฑธ๋ฆผ ( ์๋ฒ๋ฅผ ์ฌ์ฉ ๋ชปํจ ..ใ ใ )๋ฐ์ดํฐ ์์ค๋ก ๋์ฝ๋ฉ์ด ์๋จ - ๋ณต๊ตฌํด๋ฌ๋ผ๊ณ ํ๊ธฐ ( ์์๋ก 3๊ฐ๋ง ๋ณต๊ตฌํจ )๊ณต์ง์ฌํญ ๋๋ฏธ๋ฐ์ดํฐ ๋ฃ์ด์ฃผ๊ธฐ
-
withIdentifier, identifier ?
-
ํ์๊ฐ์ , ๋ก๊ทธ์ธ โ ๋น๋ฐ๋ฒํธ ๋๊ทธ๋ผ๋ฏธ๋ก ํ์
-
์ทจ์์
// MARK: - ์ทจ์์ func cancleLine(text: String, targetLabel: UILabel){ let attributedString = NSMutableAttributedString(string: text) attributedString.addAttribute(.strikethroughStyle, value: 1.07, range: (text as NSString).range(of: text)) targetLabel.attributedText = attributedString }
-
์ธ์๋ฆฌ์๋ง๋ค ์ฝค๋ง๋ฃ๊ธฐ// MARK: - ์ธ์๋ฆฌ ์ซ์๋ง๋ค ์ฝค๋ง ๋ฃ๊ธฐ func DecimalWon(value: Int) -> String{ let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let result = numberFormatter.string(from: NSNumber(value: value))! + "์" return result }
-
switch โ assert(false,"์๋") -
swift๋ string์ ๋ฐฐ์ด์ฒ๋ผ ์ง๋ฅผ ์ ์๋ค.https://ios-development.tistory.com/379
str.substring(from: 0, to: 2)
-
ํ์ด๋จธhttps://fdee.tistory.com/entry/iOS-ํ๋ก์ ํธTiTi-๊ณต๋ถ๋ฅผ-์ํ-ํ์ด๋จธiOS-UPDATE
-
์๋จ ๋ฐฐ์ก์ง ์ ํ ๋ถ๋ถ ( ํํ ๋ชจ๋ฌ )'MaterialComponents/BottomSheetโ
-
UICollectionReusableView์ ํด๋นํ๋ ๋ถ๋ถ ( ์์ธ๋ ์ฐ๊ฒฐ ) - Xib ๋ง๋ค์ด์ ์ฐ๊ฒฐ-
Xib์๋ง๋ค๊ณ ๊ทธ๋ฅ ๋์ธ ๊ฒฝ์ฐ
// // BestViewController.swift // MarketKurlyApp // // Created by ์ดํ์ฐ on 2022/01/10. // import UIKit import XLPagerTabStrip class BestViewController: UIViewController, IndicatorInfoProvider { var tabName: String = "" // MARK: - UIComponents @IBOutlet weak var collectionView: UICollectionView! // MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() setUI() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } // MARK: - Functions func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { return IndicatorInfo(title: "\(tabName)") } func setUI(){ collectionView.dataSource = self collectionView.delegate = self registerNib(cellNibName: "Product2Cell", cellIdentifier: "product2Cell") } func registerNib(cellNibName: String, cellIdentifier: String){ let newCellNib = UINib(nibName: cellNibName, bundle: nil) self.collectionView.register(newCellNib, forCellWithReuseIdentifier: cellIdentifier) } } extension BestViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 50 } func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { switch kind { case UICollectionView.elementKindSectionHeader : let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "bestHeaderView", for: indexPath) return headerView default : assert(false,"No") } } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "product2Cell", for: indexPath) as? Product2Cell else { return UICollectionViewCell() } return cell } //์ปฌ๋ ์ ๋ทฐ ์ฌ์ด์ฆ ์ค์ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let margin:CGFloat = 25 let cellRatio: CGFloat = 5/3 let screenWidth = UIScreen.main.bounds.width let cellWidth = (screenWidth-margin) / CGFloat(2) let cellHeight = cellWidth * cellRatio + 50 return CGSize(width: cellWidth, height: cellHeight) } }
-
Xib ๋ง๋ค๊ณ ๋์ ...
-
-
์ ๋ ฌํ๋ ๋๋กญ๋ค์ด -
์ ์ํ, ๋ฒ ์คํธ, ์๋ฐ์ผํ ๋ถ๋ถ ์คํฌ๋กคํ๋ฉด ํ๊บผ๋ฒ์ ๊ฐ์ด ์ฌ๋ผ๊ฐ๊ณ ์ถ์๋ฐ ๋ฐ๋ก ๋ScrollView์์ collectionView๋ฅผ ์ง์ ํด์ ์๊ธด ๋ฌธ์ ์์
collection reusable View๋ก ํด๊ฒฐ
-
๋ก๊ทธ์์ํ ๋ ํ์ฌ ๊ฐ๋ฐํ ์ํ๋ก๋ ์๋ก๊ณ ์นจ์ด ์๋จ๋น VC (์์์์) ์ผ๋ก viewWillAppear์ dismissํ๊ธฐ
-
๋น ํ์ โ ํ์์ผ๋ก ๋ก๊ทธ์ธํ ๋ ํญ๋ฐ๋ ๊ณ ์ ์ผ๋กํ๊ณ ํ๋ฉด์ด ๋ณ๊ฒฝ๋์ด์ผํ๋๋ฐ ์ด๋ฃจ์ด์ง์ง ์์์ปจํ ์ด๋๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ฆฌ
-
ํ ํ๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ณ ์ค์์ดํ๋ผ์ด๋ธ๋ฌ๋ฆฌ XLPagerTabStrip ์ฌ์ฉ
-
ํ์๊ฐ์ ํ ๋ ๋ผ๋์ค ๋ฒํผ, ์ฒดํฌ๋ฐ์ค ๋ถ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ DLRadioButton ์ฌ์ฉ
CheckBox โ https://sweetdev.tistory.com/527
-
์ฃผ๋ฌธ๋ด์ญ์์ ํ ์ด๋ธ์ ์ฌ์ด์ ๊ฐ๊ฒฉ ์กฐ์ - tableViewCell์ func layoutSubviews ๋ฅผ ์ฌ์ฉoverride func layoutSubviews() { super.layoutSubviews() contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)) }
-
๋ค๋น๊ฒ์ด์ ํญ๋ฐ ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋๋ ๋ค์ ๋ฃจํธ๋ทฐ๋ก ๋์๊ฐ์ ๋ ๋ค๋น๊ฒ์ด์ ์์์ด ๋ณ๊ฒฝ์ด ์๋จLifeCycle๋ฅผ ์ด์ฉํ์ฌ ํธ์ถ๋๋ ํ์ด๋ฐ์ ์์์ ๋ณ๊ฒฝํด์ฃผ์์, ๋, ์ ์ด์ ํ๋ฉด์ด๋ํ๋ ์ฝ๋์์ ๋ค์ ํ๋ฉด์ NavigationVC๋ก ์ด๋ํ ์ง ( present ), NavigationVC๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋ณธ์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ ์ง ( presnet , push ) ๋ฑ์์ ๊ผฌ์๋ ๋ถ๋ถ๋ ์์ - ํ๋ฆ์ ์๋ชป ํ์ ํด์ ์ฝ์ง์ ๋ง์ดํจ
-
์ํ ์์ธํ์ด์ง๋ก ํ๋ฉด ์ ํํ ๋ Pushํ๋ฉด ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ด ์๋ํ๋จLeft Items Supplment๋ฅผ ์ฒดํฌํด์ฃผ๊ณ , Back Button ๊ณต๋ฐฑ ํ๋๋ฅผ ์ ๋ ฅ
-
stepper ๋ชจ์์ด ๋ค๋ฆ - ์ปค์คํ ์ด ๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ปค์คํ ํ์ฌ ๋ง๋ฌ
-
๋ก๊ทธ์ธ ์๋จ ํ์ ์๋ฆผ์ฐฝ - ์ปค์คํ -
ํ ์ด๋ธ ์ ์ ๋๋ฅด๋ฉด ํ์ฅ๋๊ฒ ๋ง๋ค๊ธฐ -
ํ ์ด๋ธ๋ทฐ ์ ํ ์์ ์์ ๊ธฐcell.selectionStyle = .none
-
์ํ ์์ธํ์ด์ง, ์ฐ, ๊ตฌ๋งค๋ถ๋ถ ๋งจ ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ**self**.view.bringSubviewToFront(**self**.fixView)
-
๋ฒํผ ํด๋ฆญ์ ์ด๋ฏธ์ง ๋ณ๊ฒฝ@IBAction func allAgreementBtn(_ sender: UIButton!) { sender.isSelected.toggle() }
-
url์ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝํ๊ธฐ ( kingfisher )if let url: URL = URL(string: "https://i.ibb.co/TTQhmV2/047e9de093bf48d2953e8b2d64a95120.png" ){ imageDetailImgView.kf.indicatorType = .activity imageDetailImgView.kf.setImage(with:url) }
-
๋ทฐ ์์ ์ ๊ธ๊ธฐimport UIKit extension CALayer { func addBorder(_ arr_edge: [UIRectEdge], color: UIColor, width: CGFloat) { for edge in arr_edge { let border = CALayer() switch edge { case UIRectEdge.top: border.frame = CGRect.init(x: 0, y: 0, width: frame.width, height: width) break case UIRectEdge.bottom: border.frame = CGRect.init(x: 0, y: frame.height - width, width: frame.width, height: width) break case UIRectEdge.left: border.frame = CGRect.init(x: 0, y: 0, width: width, height: frame.height) break case UIRectEdge.right: border.frame = CGRect.init(x: frame.width - width, y: 0, width: width, height: frame.height) break default: break } border.backgroundColor = color.cgColor; self.addSublayer(border) } } } //์ ์ฉ ๋ฐฉ๋ฒ your_view.layer.addBorder([.top, .bottom], color: UIColor.white, width: 1.0) //์ฃผ์! viewDidAppear()<- ์ ์ ์ฉํด์ผ ์ ์ด ๊ทธ๋ ค์ง๋๋ค.
-
์ด๋ฏธ์ง์์ ์์ ์ถ์ถํ์ฌ hex๋ก ๊ฐ์ ธ์ค๋ ์ฌ์ดํธ -
ํ์ค๋ก ์กฐ๊ฑด๋ฌธ ์ฐ๊ธฐvar msg = number >= 20 ? "higger" : "lesser"
-
์๋ก๊ณ ์นจ -
ํ ์คํธํ๋ ์ก์ -
ํ๊ทธ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐhttps://apple-apeach.tistory.com/74
https://magi82.github.io/ios-intrinsicContentSize/
https://velog.io/@seondal/iOS-Collection-View-Cell-ํฌ๊ธฐ๋ฅผ-์ปจํ ์ธ ์-๋ฐ๋ผ-๋ฐ๋๊ฒ-ํ๊ธฐ
-
๋ค๋น๊ฒ์ด์ ๋ฐ ๋ฒํผ ๊ฐ๊ฒฉ - ์ปค์คํ ๋ฒํผ 2๊ฐ๋ก ํ์
-
์ฒซ๋ฒ์งธ ๋ฐฉ์
func customNaviBarItem(btnColor: UIColor, naviItem: UINavigationItem){ lazy var mapLeftBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then { $0.setImage(UIImage(systemName: "map"), for: .normal) $0.tintColor = btnColor $0.addTarget(self, action: #selector(self.addressBarBtnTapped(_:)), for: .touchUpInside) } lazy var cartRightBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then { $0.setImage(UIImage(systemName: "cart"), for: .normal) $0.tintColor = btnColor $0.addTarget(self, action: #selector(self.cartBarBtnTapped(_:)), for: .touchUpInside) } let leftBarBtnItem = UIBarButtonItem(customView: mapLeftBtn) let rightBarBtnItem = UIBarButtonItem(customView: cartRightBtn) rightBarBtnItem.imageEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 10) naviItem.rightBarButtonItems = [rightBarBtnItem,leftBarBtnItem] } @objc func addressBarBtnTapped(_ sender: AnyObject) { } @objc func cartBarBtnTapped(_ sender: AnyObject) { }
-
๋๋ฒ์งธ ๋ฐฉ์
func customNaviBarItem(btnColor: UIColor, naviItem: UINavigationItem){ lazy var mapLeftBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then { $0.setImage(UIImage(systemName: "map"), for: .normal) $0.tintColor = btnColor $0.addTarget(self, action: #selector(self.addressBarBtnTapped(_:)), for: .touchUpInside) } lazy var cartRightBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then { $0.setImage(UIImage(systemName: "cart"), for: .normal) $0.tintColor = btnColor $0.addTarget(self, action: #selector(self.cartBarBtnTapped(_:)), for: .touchUpInside) } let leftBarBtnItem = UIBarButtonItem(customView: mapLeftBtn) let rightBarBtnItem = UIBarButtonItem(customView: cartRightBtn) let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil) space.width = 15 naviItem.rightBarButtonItems = [rightBarBtnItem,space,leftBarBtnItem] } @objc func addressBarBtnTapped(_ sender: AnyObject) { } @objc func cartBarBtnTapped(_ sender: AnyObject) { }
-
-
๊ธฐ๋ณธ ์ฝ๋-
๊ธฐ๋ณธ ์ฝ๋
class AddressListCell: UITableViewCell { // MARK: - Components // MARK: - LifeCycle override func awakeFromNib() { super.awakeFromNib() setUI() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } // MARK: - Functions func setUI(){ } }
extension AddressManagmentViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "AddressListCell", for: indexPath) as? AddressListCell else { return UITableViewCell() } return cell } }
// MARK: - Components // MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() setUI() } // MARK: - Functions func setUI(){ }
-
ํ๋ฉด ์ด๋
let storyboard = UIStoryboard(name: "Item", bundle: nil) let ItemDetailVC = storyboard.instantiateViewController(identifier: "ItemDetailSB") ItemDetailVC.modalPresentationStyle = .fullScreen
let storyboard = UIStoryboard(name: "Login", bundle: nil) guard let IdResultVC = storyboard.instantiateViewController(identifier: "IdResultSB") as? IdResultViewController else { return } IdResultVC.userId = self.findUserIdx! self.navigationController?.pushViewController(IdResultVC, animated: true)
-
-
๋ค๋น๊ฒ์ด์ ํญ๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด์ ์ปค์คํ ํ๋ ค๊ณ ํ์ผ๋, ํฌ๊ธฐ ์กฐ์ ์ด ์คํจํจ ( ํ์์ ) - ok
-
์ฐ๋ ธ - ์ด ์ํ ์ด๋์ ํน์ ์ ์ ์ ๋ชฉํ ์คํธ ๋ณด์ด๋ ์ํ๊ฐ ์ค์ ์ฑ์ด๋ ์ข ๋ค๋ฆ( ํ์์ ) - ok
-
๋ฐฐ์ก์ง ์๋ก ๋ฑ๋กํ ๋ ์ฃผ์๊ฒ์์ ํด๋นํ๋ ๋ถ๋ถ์ ์์๋ก ํ๋ฉด ์์ ํ์ โ ์ถํ ์นด์นด์ค API๋ก ํ ์์ -
๋ฐฐ์ก์ง ์ ํ ํํ ๋ชจ๋ฌ๋ฐํ ์ํธ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ
-
delegate, MVVM ํจํด ๊ฐ์๋ฅผ ํด์ฃผ์ฌ ๐ -
์๋ฒ์์ ํต์ ๋ถ๋ถ ๋ถ๋ฆฌ- ์๋ฒ์ ์ฐ๋ํ๊ธฐ ์ ํ๋ฉด ๊ตฌ์ํ ๋ ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ผ ๋ ํ ๋ฐ
-
ํ ํ๋ฉด์์ MD์ ์ถ์ฒ ๋ถ๋ถ ๋นผ๊ณ ์งํํ๊ธฐ -
์ต๊ทผ ๊ฒ์์ด ํ๊ทธ ๋ถ๋ถ ๋๋น๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ ์คํธ์ ๊ธธ์ด๋ฅผ ๋ฐ์์์ ๋๋น ์ง์
-
๋ด๋น๊ฒ์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ณ๊ฒฝfunc customNavigationBarAttribute(_ backgroundColor: UIColor, _ titleColor: UIColor) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = backgroundColor appearance.titleTextAttributes = [.foregroundColor: titleColor] appearance.shadowColor = .clear self.navigationController?.navigationBar.standardAppearance = appearance self.navigationController?.navigationBar.scrollEdgeAppearance = appearance }
-
API ๋ช ์ธ์ ๋ณด์ฌ์ฃผ๋ฉด์ ์ ๋ ฌ(์ ์ํ,๋ฒ ์คํธ,์๋ฐ์ผํ,์ถ์ฒ์... ๋ฑ)ํ๋ ๋ถ๋ถ์๋ฒ์์ ํ๋ ๊ฒ ๋ง๋์ง, ํด๋ผ์ด์ธํธ์์ ํ๋ ๊ฒ ๋ง๋์ง โ ์๋ฒ
-
์์ดํ ์์ธํ์ด์ง๋ก ์ด๋ํ ๋ ์์ผ๋ก ์ด๋ํ๋ ๋ถ๋ถ์์ ๋ฐ์ํ๋ ๋ฌธ์ -
push ๋์์ด ๋์ด์ผํ๋๋ฐ ํญ๋ฐ๊ฐ ์๋์ ๊ทธ๋๋ก ๋จ์ - ํญ๋ฐ ์จ๊ธฐ๋ฉด ๋จ
๋์ธ ํ๋ฉด์ WillAppear, Disapper์ ์์ฑํด์ฃผ๋ฉด ๋จ
self.tabBarController?.tabBar.isHidden = true
-
modal๋ก ๋์ฐ๊ณ , pushํ ๋์ ๊ฐ์ ์ ๋๋ฉ์ด์ ๋์ - ๋น์ถ ( ์ตํ์ ์๋จ )
-
-
๋ค๋น๊ฒ์ด์ ํ๋ฉด์ ํ(push)ํ ๋ ์๋์ผ๋ก ์์ฑ๋๋ ์ผ์ชฝ ๋ฐฑ๋ฒํผ ๋ถ๋ถ์๋์ผ๋ก ์ผ์ชฝ ๋ฐฑ๋ฒํผ์ด ๋์ค๋ฉด, ์์๊ณผ navigationBar์ ํ์ดํ์ ์์ ๋ฉด ๋จ.
func naviTitleDelete(navi: UINavigationController){ navi.navigationBar.tintColor = .black navi.navigationBar.topItem?.title = "" }
-
์คํฌ๋กค๋ทฐ์์ ๋์ ์ผ๋ก ๋์ด ์กฐ์ ์ ํ๊ณ ์ถ์๋์ ์ผ๋ก ๋์ด๊ฐ ์กฐ์ ๋๋ StackView๋ฅผ ํ์ฉํ๋ฉด ๋จ
-
์ ๋ง๋ค ๋์ ์ผ๋ก ๋์ด ์กฐ์ ํ๊ณ ์ถ์UITableView.automaticDimension ์ ์ ์ฉํด์ฃผ๋ฉด ๋จ ( ๋จ, ์คํ ๋ฆฌ๋ณด๋์์ ์ ์ฝ์กฐ๊ฑด์ ์ ์ค์ ๋์ผ๋จ )
-
๋ฒ์ 15์ด์์ผ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ค๋น๊ฒ์ด์ ๋ฐฐ๊ฒฝ์์, ํ์ดํ์์ ์ด์self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]