๐ฑ iOS
UserDefaults ๊ฐ ํ๋๋ก ์ฑ ์ง์ ์ 1ํ๋ง ๊ฒ์ฌํ๋ ๋ก์ง ๊ด๋ฆฌํ๊ธฐ
์ฑ์ ์๋น์คํ๋ค๋ณด๋ฉด ๋ฒ๊ทธ๊ฐ์ ๋๋ ์ ๋ฐ์ดํธ ์๋ด ๋ฑ์ ์ด์ ๋ก ๋จ 1ํ๋ง ๋์ํ๋ ์ฝ๋๊ฐ ํ์ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, TiTi์์๋ ๋น์ด์๋ ๊ธฐ๋ก ๊ฐ์ฒด์ธ Daily๊ฐ ์ฌ๋ผ์ง์ง ์์์ Logํ๋ฉด์ ๊ธฐ๋ก์ด ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๋ฒ๊ทธ๊ฐ ์์๋๋ฐ์,๋ณด๋ค์ํผ ๊ธฐ๋ก์ด ๋น์ด ์๋๋ฐ๋ ๋ ์ง ์๋์ ์ ์ด ์ฐํ ์์ต๋๋ค (๊ธฐ๋ก์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ด ์ฐํ ์์ด์ผํจ) ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ๋์์ด ํ์ ํ์ต๋๋ค. 1. ์ฌ์ฉ์๊ฐ ๊ธฐ๋ก์ ํธ์งํด์ ๊ทธ ๋ ์ ๊ธฐ๋ก์ ๋ชจ๋ ์ง์ฐ๋ ๊ฒฝ์ฐ Daily๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค.2. ๋ฒ๊ทธ ๊ฐ์ ์ ์ ์กด์ฌํ๋ ๋น์ด์๋ Daily๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์ญ์ ํ๋ค. ์ฌ๊ธฐ์ 2๋ฒ์ ์ฌ์ฉ์๊ฐ ์ฑ์ ์ง์ ํ ๋ 1ํ๋ง ์์ ํ๋ฉด ๋๋ ๋ด์ฉ์ ๋๋ค.์ฌ๋ฌ๋ฒ ๋์ํด๋ ๋ฌธ์ ๋ ์๊ฒ ์ง๋ง, ๋น์ด ์๋ Daily๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ..
modalPresentationStyle ์ค์ ์์ (feat.ViewLifeCycle)
์ฌ์ด๋ ํ๋ก์ ํธ์์ ํฌ๋ช ํ ViewController๋ฅผ ๋์ธ ์ผ์ด ์๊ฒผ๋๋ฐ, `modalPresentationStyle = .overFullScreen` ์ viewDidLoad() ์์ ์ ์์ฑํ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค. viewDidLoad()๋ present() ์ดํ์ ํธ์ถ๋์ด View๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋๋ฐ,์๋ง present()ํ๋ ๋น์์ ์๋ก์ดVC๊ฐ ๊ฐ์ง modalStyle์ ์ ์ฉํ๋ ๋ฏ ํ๋ค.present ์๋๋ฉ์ด์ ์ ์ฉํ๋ ค๋ฉด ๊ทธ๋์ผ ํ ๊ฒ ๊ฐ๋ค.. ๊ทธ๋์ presentํ๊ธฐ ์ ์ modalStyle์ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋๋ฐ, ๋ณดํต์ presentํ๋ VC์์ ์ค์ ํด์ฃผ์ง๋ง,์ธ๋ถ์์ ํด๋น ViewController๋ฅผ ์ปจํธ๋กคํ์ง ์๋๋ก ํ๊ธฐ ์ํด init()์์ ์ modalStyle์ ์ ์ฉ..
[UIKit] TableView Multiple Cell, multi type json data parsing
TableView๋ ํ๋์ Cell์ด ์๋ ๋ค์ํ Cell์ ๊ฐ์ง ์ ์์ต๋๋ค.์ข ์ข ์ฑ์ ๋ณด๋ค๋ณด๋ฉด tableview ์ค๊ฐ์ค๊ฐ ๊ด๊ณ ๊ฐ ๋์จ๋ค๊ฑฐ๋, ๋๋ฅผ ์ํ ์ถ์ฒ์ ํ๋ค๊ฑฐ๋ ...๋๋ถ๋ถ์ ์ฑ ์๋น์ค๊ฐ tableview๋ฅผ ์ฌ์ฉํ๊ณ , multiple cell์ ์ฌ์ฉํฉ๋๋ค.๊ทธ๋์ ์ ๋ multiple cell์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ฑ์ ๋ง๋ค์ด ๋ณผ๊ฒ์ ๋๋ค! ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋จผ์ ๋ฉํฐํ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง์ ๋ํด ๊ณ ๋ฏผํด์ผํฉ๋๋ค.(JSON์ ๋ํ ๋ด์ฉ์ ์ ์๊ธ์ ์์ต๋๋ค)๋๋ณด๊ธฐlet JSONData ="""{ "data" : [ { "type" : "TITLE_ONLY", "title" : "Struct vs Class" }, ..
[Swift] ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ NetworkManager๋ง๋ค๊ธฐ (feat. Generic)
์ง๋๋ฒ์ ์ด๋ฐ ๊ธ์ ์ผ์๋๋ฐ, https://990427.tistory.com/112 [Swift] json value type์ด ๋ฌ๋ผ์ง๋ response์ ๋์ํ์ฌ API Responder๋ง๋ค๊ธฐ ์์ฆ Set์ด ๋ ๋์ ๊ฐ๋ฐ ์คํ์ผ,, ์ค๋ณต์ ๋ค ์ ๊ฑฐํด๋ฒ๋ฆฌ์ ์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ์์ API๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์ธํ์ต๋๋ค ๊ทธ๋์ ์ด๋ค api๋ฅผ ํธ์ถํ๋์ ๋ฐ๋ผ form์ ๋ณํ๋ ์์ง๋ง data์ ๊ฐ์ ํญ์ 990427.tistory.com ์ํ ์ฝ๋๋ฅผ ๋ฐ์ ์ ์๋ค๋ ๋ฌธ์ ์ ๋ ์์๊ณ , ๋ชจ๋๋ง๋ค ๋ค ๋ค๋ฅธ MoyaProvider๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋๊น ์ ๋ฒ์ ๋ง๋ ํจ์์ ์ฐ์์ด ์ข.. ๋ณ๋ก๋๊น? ๊ทธ๋์ ๊ฐ์ ํด๋ณด์!๊ณ ์๊ฐํ๊ณ ์กฐ๊ธ๋ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก BaseNetworkManager๋ฅผ ๋ง๋ค๊ธฐ๋ก ํ์ต๋๋ค. Ba..
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (3/3)
Rx๋ฅผ ๋ชจ๋ฅด์ ๋ค๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค ๐ฅน ๋๋์ด ๋ง์ง๋ง ๊ด๋ฌธ.. ๋ ,์์ ๊ด์ฐฐํ์ฌ ์ผ ์๋ฅผ ์ ํ์! ์ผ๋จ ๋๋ ์ง๊ธ ์ด๊ฑธ ๋ง๋๋ ์ค์ด๋ค ๋ ,์์ ์์กด์ฑ์ด ์์ง๋ง, '์ผ'์ ๋ ,์์ ์์กด์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค. 1์์ 31์ผ๊น์ง, 2์์ 28์ผ๊น์ง ๋ญ์ด๋ฐ๊ฑฐ ~.. ๊ทธ๋์ '์ผ'์ ๋ ,์์ด ๋ฐ๋๋ฉด reset์ ํด์ฃผ์ด์ผ ํ๋ค. ์๋ฅผ๋ค์ด 2023๋ 1์31์ผ์ ๋ง๋ค์ด์ค ์ํ์์ '์'์ 2์๋ก ๋ฐ๊พธ๋ฉด 31์ผ์ ์๊ธฐ ๋๋ฌธ์!! ๊ทธ๋์ customPicker์์ ๋ญ๊ฐ๋ฅผ ์ ํํ์ ๋ ๊ด์ฐฐํ๋ ๋์์๊ฒ ์๋ ค์ค ์ ์๋๋ก Rx๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ์ฉํ๋ค. (1/3)์์ ๋ง๋ค์๋ CustomPickerButton์ ์ถ๊ฐํ ๋ถ๋ถ! public class CustomPickerButton: UIButton { var change..
[Swift] ์๋ฒ์ iOS ์ด๋ฏธ์ง ๋ณด๋ผ ๋ ์ฉ๋ ์ด์ & ํด๊ฒฐ
์ด๋ฏธ์ง ์ ๋ก๋ ๊ตฌํ์ค์ ์๊ธด ์ด์ form-data๋ก ์์ดํฐ ์ฌ์ง์ฒฉ์ ์๋ ์ด๋ฏธ์ง๋ฅผ ์๋ฒ๋ก ๋ณด๋ด๋ ค๋ฉด JPEG๋ก ๋ณํํด์ผ ํฉ๋๋ค ์์ดํฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก HEIF ํ์ฅ์๋ก ์ฌ์ง์ ์ ์ฅํ๋๋ฐ, ์ด๋ ํธํ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค ์ด์จ๋ ์ฐ๋ฆฌ๋ PHPicker๋ฅผ ํตํด์ ์ฌ์ง์ฒฉ์ ์๋ ์ฌ์ง์ ๊ฐ์ ธ์ฌ ์ ์๊ณ , ์ด๋ฅผ jpeg๋ก ๋ณํํ๊ธฐ ์ํด jpegData๋ฅผ ์ฌ์ฉํฉ๋๋ค image.jpegData(compressionQuality: 1.0) ์ฌ์ค ๋ค์ 1.0์ ๊ธฐ๋ณธ๊ฐ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์๋ฌด ์๊ฐ์์ด ์ผ๋๋ฐ ์๋๋งค ์ด์๊ฐ ์๊ธธ์ค์ด์ผ... Moya๋ฅผ ํตํด API ํต์ ์ ํ๋๋ฐ, ๊ณ์ ์ด๋ฐ ์๋ฌ๊ฐ ๋จ๋ ๊ฒ.. Failed to map data to a Decodable object. postman์ผ๋ก ์์ดํฐ ์ฌ์ง์ฒฉ์ ์๋ ์ฌ์ง ..
[UIKit] toast message ๋ง๋ค๊ธฐ
์ฑ์ ๋ง๋ค๋ค๋ณด๋ฉด toast msg๋ฅผ ๋์์ ์ ๋ณด๋ฅผ ์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ์์ฝ๊ฒ๋ iOS์๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ด ์๋ค.. ์ง์ ๋ง๋ค์! ์ฐ์ UIView๋ฅผ ์์ํ๋ class๋ฅผ ๋ง๋ค์ด ์ค๋๋ค public class ToastMessage: UIView {} ์ ๋ ์๋ก ์ข ๋ฅ์ ํ ์คํธ ๋ฉ์ธ์ง๋ฅผ ๋ง๋ค๊ฑฐ์์ (x๋ ์ ์ธ) ๊ทธ๋์ ์ด๋ฐ ํ๋กํผํฐ์ enum์ด ํ์ํฉ๋๋ค public enum ToastType { case common, alert, info } var text = UILabel() var icon = UIImageView() var type : ToastType UI๋ ๊ฐ์ ์ทจํฅ๊ป ๋ง๋์๊ณ (์๋ต) ํ ์คํธ ๋ฉ์ธ์ง์ ํน์ง์ ์ ๊น ๋ด๋ค ์ฌ๋ผ์ง๋๊ฑฐ ์์์ ? ๊ทธ ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ์ํด animate๋ฅผ ์ฌ์ฉํ์ต๋๋ค an..
[Swift] json value type์ด ๋ฌ๋ผ์ง๋ response์ ๋์ํ์ฌ API Responder๋ง๋ค๊ธฐ
์์ฆ Set์ด ๋ ๋์ ๊ฐ๋ฐ ์คํ์ผ,, ์ค๋ณต์ ๋ค ์ ๊ฑฐํด๋ฒ๋ฆฌ์ ์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ์์ API๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์ธํ์ต๋๋ค ๊ทธ๋์ ์ด๋ค api๋ฅผ ํธ์ถํ๋์ ๋ฐ๋ผ form์ ๋ณํ๋ ์์ง๋ง data์ ๊ฐ์ ํญ์ ๋ฌ๋ผ์ง๋ค ์ผ๋จ json์ ํ์ฑํ struct๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋๋ฐ, ๋ชจ๋ api๋ง๋ค struct๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ์ด๋ฐ์์ผ๋ก ๊ณ์ํด์ DTO struct์ ์ค๋ณต์ด ์ผ์ด๋๊ฒ ๋๋ค ์ค๋ณต์ด ๋๋ฌด ์ซ์ ๋.. ์ ๋ค๋ฆญ์ผ๋ก ๋ฌถ์! struct ResponseDTO : Decodable { var success : Bool var data : CommonDataDTO var error : ErrorDTO? } struct ErrorDTO : Decodable, Error { let code : Int let mes..
[RxSwift] ๊ฐ๋ ์ก๊ธฐ (Subscribe, Observable, Subject)
์ต๋ํ ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋ณด๋ RxSwift iOS ๊ณต๋ถํ๋ ์ฌ๋์ ๋ฌด์กฐ๊ฑด ๋ค์ด๋ดค์ RxSwift RxSwift๋ ReactiveX Swift์ธ๋ฐ์, reactiveX ? ๋์ถฉ ํด์ํ๋ฉด ์ต์ ๋ฒ๋ธ์ ์ฌ์ฉํด์ ๋น๋๊ธฐ๋ event-based๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค ์ต์ ๋ฒ๋ธ์ด ๋ญ๋ฐ ????? Observable ? ๋์ถฉ ํด์ํ๋ฉด - ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ ํ๋ค - ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ด ๋ฐฉ์ถํ๋ items์ ๋ํด ๋ฐ์ํ๋ค - ์ต์ ๋ฒ๋ ๋๊ธฐํ์ง ์๊ณ , ๋ฐ์ํ ์ค๋น๋ฅผ ํ ์ด๋ ํ ํํ๋ก ๊ธฐ๋ค๋ฆฐ๋ค items์ด ์ด๋ค๊ฑด์ง๋ ๋ชฐ๋ผ๋ ์ผ๋จ ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ด ๋ญ๊ฐ๋ฅผ ํ๋ฉด ๋ฐ์ํ๋!! ์ต์ ๋ฒ๊ฐ ๋ฌด์จ ํํ์ธ์ง๋ ๋ชฐ๋ผ๋ ์ผ๋จ ๋๊ธฐ ใดใด ์ฆ, sync ใดใด ๋ง์ ์ฉ์ด๋ค์ด ๋์ค๋๋ฐ Observer, Observable, Subscribe ๊ทผ๋ฐ ์ด..
[Swift] Custom Calendar ๋ฌ์ ๋ง์ง๋ง ๋ ๊ตฌํ๊ธฐ
์ด ๊ธ์ UI๋ฅผ ์ ์ธํ๊ณ ๋ ์ง ๊ณ์ฐ์ ํ๋ ๋ก์ง๋ง ๋ด๊ณ ์์ต๋๋ค Custom Calendar๋ฅผ ๋ง๋ค๋ค๋ณด๋ ํด๋นํ๋ ๋ฌ์ ๋ง์ง๋ง ๋ ์ด ์ธ์ ์ธ์ง ๊ณ์ฐํด์ผ ํ๋ค. ์๊ณ ๋ฆฌ์ฆ ์ฒ๋ผ ์ ๊ทผํ๋ฉด ์ค ๋ฌ๋ ๊ณ์ฐํด์ค์ผ ํ๊ณ ์๋ ์ธก๋ฉด์์๋ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํด์ foundation์์ ์๋ calendar๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์๋ค! ๋จผ์ ๋ ์ง ๊ณ์ฐ์ ํ์ํ Calendar์ DateFormatter๋ฅผ ๋ง๋ค์ด์ฃผ์ let calendar = Calendar(identifier: .gregorian) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" ์ฒซ ๋ ์ ๋ฌด์กฐ๊ฑด 1์ผ์ด๋๊น ์ง์ ์ ๋ ฅํด์ค๋ค let st = dateFormatter.da..