๐ฑ iOS/UIKit
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" }, ..
[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..
[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..
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (2/3)
CustomPickerButton์ ๋ง๋ค์์ผ๋ DatePicker๋ก ์งํํด๋ณด์ ์๋ค์ํผ ๋๋ ์ด๊ฑธ ๋ง๋ค๊ธฐ๋ก ํ๋ค ๐ UI setting ๋ณ๊ฑฐ ์๋ค.. ๊ทธ๋ฅ ในใ UI setting code open class CustomDatePicker: UIView{ private var Titlelabel = UILabel() private var years = [String]() private var months = [String]() private var days = [String]() private let yearWidth : CGFloat = 126 private let monthWidth : CGFloat = 103 private let dayWidth : CGFloat = 103 private lazy ..
[UIKit] CustomDatePicker ๋ง๋ค๊ธฐ (1/3)
UIKit ๊ณต๋ถ๊ฒธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋์ค์ DatePicker๋ฅผ ์ปค์คํ ํด์ผ ํ๋ ์ํฉ๊ณผ ๋ง์ฃผํ๋ค. ๐ ๊ตฌํ๋ด์ฉ ์ผ๋จ ๊ธฐ๋ณธ ์ ๊ณต๋๋ DatePicker๋ฅผ ์ฌ์ฉํ ์๋ ์์๋ค ๊ทธ๋์ UIButton์ inputView์ pickerView๋ฅผ ๋ฃ์ด์ ๋ง๋ค๊ฒ์ด๋ค ์ผ๋ฐ์ ์ผ๋ก TextField์ inputView์ pickerView๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋๋ TextField๊ฐ ํ์์์ด์ ๋์ฅ์ ์ ๊ฑธ์ด๋ณด๊ธฐ๋ก ํ๋ค.. ๐ UI setting ์์ ์ธ๊ธํ๋ CustomDatePicker์์ box ํ๋์ฉ์ CustomPickerButton์ด๋ผ๊ณ ํ๊ฒ ๋ค. // CustomPickerButton.swift public class CustomPickerButton: UIButton { private var uiView = UIV..
Passing Data (์ง์ ์ ๋ฌ๋ฐฉ์)
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฌ์ฏ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด์ ! 1. instance property ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController ํ๋กํผํฐ์ ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ property๋ฅผ ์ ์ธํ๊ณ , ๊ทธ property์ ๊ฐ์ UI์ ์ ์ฉํ๋ ์๋ฆฌ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ViewController propertyDataViewController.swift var passingData = "" //์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์ ๋ฌ๋ฐ์ ์์ @IBOutlet weak var setPassingData: UILabel! //์ฌ๊ธฐ์ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ ์ ์ฉ override func viewDidLoad() { super.viewDidLoad() setPassingData.text = passingData } ๋ฐ์ดํฐ๋ฅผ ..