๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ก work work work/swift

swift ์‹ค์Šต - 3.2 : Setting App Clone

by hanwitjus 2022. 2. 15.

์˜ค๋Š˜์€ ์–ด์ œ ํ–ˆ๋˜ ์•„์ดํฐ ์„ค์ • ๊ธฐ๋ณธ ์•ฑ์„ ํด๋ก ํ•˜๋Š” ๊ฒƒ์„ ์™„์„ฑํ•˜์˜€๋‹ค. 

์–ด์ œ ํ–ˆ๋˜ ์–‘๋ณด๋‹ค ์˜ค๋Š˜ ํ•œ๊ฒŒ ํ›จ์”ฌ ๋งŽ์•„์„œ ์–ด๋””์„œ๋ถ€ํ„ฐ ์ •๋ฆฌํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค... 

๊ผผ๊ผผํ•˜๊ฒŒ ๋‹ค ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์€๋ฐ ๊ทธ๋Ÿฌ๊ธฐ์—” 

๊ฐ•์˜ ๋“ฃ๊ธฐ & ํ•„๊ธฐ & ์‹ค์Šต ๋”ฐ๋ผํ•˜๊ธฐ & ๋ธ”๋กœ๊ทธ ๊ธ€ ์ •๋ฆฌ 4๊ฐ€์ง€๋ฅผ ํ•œ๊บผ๋ฒˆ์— ํ•ด์•ผ๋ผ์„œ ๋ถˆ๊ฐ€^^

 

์ผ๋‹จ ๊ธฐ์–ต๋‚˜๋Š”๋Œ€๋กœ ์ ์–ด๋ด์•ผ์ง€.. (๊ตฌํ˜„ ์ˆœ์„œ์— ์ƒ๊ด€ X)

 

 

1. Navigation Controller ์ถ”๊ฐ€

 

๋จผ์ € ์›๋ž˜ ์„ค์ • ์•ฑ์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ” ๋ถ€๋ถ„์„ ๋ณด๋ฉด

 

์ €๋ ‡๊ฒŒ ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๋ฉด "์„ค์ •"์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š” ๋ถ€๋ถ„์ด ํฐ ํƒ€์ดํ‹€์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์•ˆ์ชฝ ํƒ€์ดํ‹€๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋‚ด๊ฐ€ ํด๋ก ํ•  ์•ฑ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ € ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

 

๊ทธ๋Ÿด๋ ค๋ฉด ๋จผ์ € ์ด๋ ‡๊ฒŒ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์—ฐ๊ฒฐํ•ด๋†“๋Š”๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ViewController์—์„œ ์ ‘๊ทผํ•ด์„œ title์„ ๋งˆ์Œ๋Œ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

override func viewDidLoad() {
        super.viewDidLoad()
        
        // .. ์ƒ๋žต
        
        self.title = "Settings"
  }

์ด๋ ‡๊ฒŒ ViewController์˜ viewDidLoad() ํ•จ์ˆ˜์— ํƒ€์ดํ‹€์„ ์ง€์ •ํ•ด ๋†“์œผ๋ฉด ๋œ๋‹ค.

 

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด ๋งจ ์ฒ˜์Œ์— ํฐ ๊ธ€์”จ๋กœ ๋‚˜์˜ค๋Š” LargeTitle์ด ๋‚˜์˜ค์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์ค‘์•™์— ์ž‘๊ฒŒ ํƒ€์ดํ‹€๋งŒ ํ‘œ์‹œ๋œ๋‹ค.

 

๋งจ ์ฒ˜์Œ ์›€์งค์ฒ˜๋Ÿผ ์ฒ˜์Œ์—” ํฐ ํƒ€์ดํ‹€์ด ๋‚˜์™”๋‹ค๊ฐ€ ์Šคํฌ๋กคํ•˜๋ฉด ์ž‘์€ ํƒ€์ดํ‹€๋กœ ์‚ฌ๋ผ์กŒ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด

๋‹ค๋ฅธ ์ฝ”๋“œ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.prefersLargeTitles = true

    }

viewWillAppear() ์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๋ทฐ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

(didLoad๋Š” ๋ฉ”์ธ ํ™”๋ฉด์˜ ๊ฒฝ์šฐ ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ ๋‚˜๋ฉด ๋)

 

์—ฌ๊ธฐ์— ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ prefersLargeTitles ๊ฐ’์„ true๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋ทฐ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํฐ ํƒ€์ดํ‹€์ด ๋ณด์—ฌ์ง„๋‹ค.

 

์™„์„ฑ๋œ ๋ชจ์Šต

 

 

2. Model ์ƒ์„ฑ ๋ฐ ๋ทฐ๋ฆฌ์ŠคํŠธ ๋‚ด์šฉ ์ถ”๊ฐ€

 

์–ด์ œ ๋งŒ๋“ค์—ˆ๋˜ ๋ชจ์Šต์—๋Š” label์— ์•„๋ฌด ๋‚ด์šฉ๋„ ๋“ค์–ด๊ฐ€ ์žˆ์ง€๊ฐ€ ์•Š์•˜์—ˆ๋‹ค. 

๊ฑฐ๊ธฐ์— ๋‚ด์šฉ์„ ์ฑ„์›Œ์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € Model์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

์ผ๋ฐ˜ swiftํŒŒ์ผ๋กœ SettingModel.swift๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

import Foundation

struct SettingModel {
    var leftImageName: String = ""
    var menuTitle: String = ""
    var subTitle: String?
    var rightImageName: String?
    
}

 

๊ทธ๋ƒฅ ๋‹จ์ˆœํ•œ struct๋กœ ๊ฐ๊ฐ ์ด๋ฏธ์ง€ ๋ถ€๋ถ„๊ณผ ๋ ˆ์ด๋ธ”๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•  String๋“ค์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ViewController์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•œ๋‹ค.

 

var settingModel = [[SettingModel]]() //2์ค‘ ๋ฐฐ์—ด
    
    @IBOutlet weak var settingTableView: UITableView!
    
    func makeData() {
        settingModel.append([SettingModel(leftImageName: "person.circle", menuTitle: "Sign in to your iPhone", subTitle: "Set up iCloud, the App Store, and more.", rightImageName: nil)])
        
        
        settingModel.append([SettingModel(leftImageName: "gear", menuTitle: "General", subTitle: nil, rightImageName: "chevron.right"),
                SettingModel(leftImageName: "person.fill", menuTitle: "Accessibility", subTitle: nil, rightImageName: "chevron.right"),
                SettingModel(leftImageName: "hand.raised.fill", menuTitle: "Privacy", subTitle: nil, rightImageName: "chevron.right")])
        
        
    }

 

์„ค์ • ํ™”๋ฉด์—์„œ ๋ณด์ด๋Š” ๋ฐ”์™€ ๊ฐ™์ด ๊ฐ๊ฐ ์š”์†Œ๋“ค์ด ์„น์…˜์ด ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. 

์ฒซ๋ฒˆ์งธ ์„น์…˜์—๋Š” 1๊ฐ€์ง€ cell, ๋‘๋ฒˆ์งธ ์„น์…˜์—๋Š” 3๊ฐ€์ง€ cell๋“ค์ด ์žˆ๋‹ค. 

๊ทธ๋ž˜์„œ 2์ค‘ ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ์— ์š”์†Œ๋“ค์„ ๋„ฃ๋Š”๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์€ apple ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” SF Symbols์— ์žˆ๋Š” ์‹œ์Šคํ…œ ์ด๋ฆ„์ด๋‹ค. 

 

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  Delegate์—์„œ ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

 

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return settingModel[section].count
    }
    
 func numberOfSections(in tableView: UITableView) -> Int {
        return settingModel.count
    }

 

์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” numberOfRowsInSection์œผ๋กœ ๊ฐ ์„น์…˜์— ๋ช‡๊ฐœ์˜ ํ–‰์ด ์žˆ๋Š”์ง€ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๊ณ 

๋‘๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์„น์…˜์˜ ์ˆ˜๊ฐ€ ๋ช‡๊ฐ ์ง€ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ cell์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ๋“ค์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        if indexPath.section == 0 {
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCell", for: indexPath) as! ProfileCell
            
            cell.topTitle.text = settingModel[indexPath.section][indexPath.row].menuTitle
            cell.profileImageView.image = UIImage(systemName: settingModel[indexPath.section][indexPath.row].leftImageName)
            cell.bottomDescription.text = settingModel[indexPath.section][indexPath.row].subTitle
            
            return cell
        }
        
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath) as! MenuCell
        
        cell.leftImageView.image = UIImage(systemName: settingModel[indexPath.section][indexPath.row].leftImageName)
        
        cell.middleTitle.text = settingModel[indexPath.section][indexPath.row].menuTitle
        
        cell.rightImageView.image = UIImage(systemName: settingModel[indexPath.section][indexPath.row].rightImageName ?? "")
        
        cell.rightImageView.tintColor = .lightGray
        
        
        return cell
     
    }

์ฒซ๋ฒˆ์งธ ํ–‰์— ๋‚˜์˜ค๋Š” profile์€ ๋ฐ‘์— ๋‹ค๋ฅธ cell๋“ค๊ณผ ๋‹ค๋ฅธ ๋ชจ์Šต์ด๊ธฐ ๋•Œ๋ฌธ์— if ๋ฌธ์œผ๋กœ ์„น์…˜์„ ๋‚˜๋ˆ„์–ด์„œ ๊ฐ๊ฐ ์„ค์ •ํ•ด์ฃผ๊ณ 

ํ•„์š”ํ•˜๋‹ค๋ฉด ์ƒ‰์ƒ๋„ ์„ค์ •ํ•ด์ค€๋‹ค.

 

 

3. General ์„ค์ • 

(ํ•˜ ๋‹ค ๋‚ ๋ผ๊ฐ”๋‹ค.. ใ…ใ…Š... ๊ฑฐ์˜ ๋‹ค์จ์„œ ์™„๋ฃŒ๋งŒ ๋ˆ„๋ฅด๋ฉด ๋์—ˆ๋Š”๋ฐ... ๋‘์‹œ๊ฐ„ ๋™์•ˆ ์ผ๋Š”๋ฐ.. ๋‹ค์‹œ..์จ์•ผ์ง€...)

 

์ด์ œ ์ฒ˜์Œ ๋ณด์ด๋Š” ํ™”๋ฉด์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์€ ๋งˆ์ณค๊ณ , General(์ผ๋ฐ˜) ์„ค์ • ์…€์„ ๋ˆŒ๋ €์„ ๋•Œ ๋‚˜์˜ค๋Š” ํ™”๋ฉด์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ํ–ˆ๋‹ค.

 

 

 

 

 

 

 

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ์ผ๋ฐ˜์„ ๋ˆŒ๋ €์„ ๋•Œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๋ทฐ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ผ๋ฐ˜ ์„ค์ • ํ…Œ์ด๋ธ” ๋ทฐ์˜ ์…€๋“ค์€ ๋ ˆ์ด๋ธ” ํ•œ๊ฐœ์™€ ์ด๋ฏธ์ง€ ๋ทฐ ํ•œ๊ฐœ๋กœ ๊ตฌ์„ฑ๋ผ์žˆ๊ณ ,

๋˜‘๊ฐ™์ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๊ฐ€ ์žˆ๋‹ค.

 

๋ณด์ด๋Š” ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™์ด ๋งŒ๋“ค์–ด๋ดค๋‹ค.

 

 

 

 

 

 

 

๊ทผ๋ฐ ์ด๋ฒˆ์—” ๋‹ค๋ฅธ ๋•Œ์™€ ๊ฐ™์ด Cell, Struct(Model), Controller์˜ ํŒŒ์ผ๋“ค์„ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  

GeneralViewController์—์„œ ๋‹ค๊ฐ™์ด ํ•œ๊บผ๋ฒˆ์— ์ฝ”๋”ฉํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด ์ข‹์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ธ๋ฐ

์ง€๊ธˆ์€ ์—„์ฒญ ๋‹จ์ˆœํ•˜๊ธฐ๋„ ํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ธธ์ง€๋„ ์•Š์•„์„œ ์ด ๋ฐฉ๋ฒ•๋„ ๊ฐ•์˜์—์„œ ๊ฐ€๋ฅด์ณ์คฌ๋‹ค.

 

 

 

 

 

 

 

 

 

 

์ผ๋‹จ ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

Cell์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  

ํ…Œ์ด๋ธ” ๋ทฐ ์œ„์— Table View Cell ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค.

๋ทฐ ์ด๋ฆ„์€ GeneralViewController ์ด๋‹ค.

 

 

 

 

 

 

 

 

GeneralViewController.swift์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด

import UIKit

class GeneralCell: UITableViewCell {
    @IBOutlet weak var leftLabel: UILabel!
    @IBOutlet weak var rightImageView: UIImageView! {
        didSet{
            rightImageView.image = UIImage.init(systemName: "chevron.right")
        }
    }
    
}
struct GeneralModel {
    var leftTitle: String = ""
}

 

๋จผ์ € TableView์— ๋Œ€ํ•œ ํด๋ž˜์Šค GeneralCell์„ ์„ ์–ธํ•˜๊ณ  ๊ทธ ์•ˆ์— ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ์•„์›ƒ๋ ›์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

์—ฌ๊ธฐ์„œ rightImageView๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ ๊บพ์‡  ์•„์ด์ฝ˜์ด๋ฏ€๋กœ didSet์„ ์ด์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ์„ค์ •์„ ํ•ด ๋†“๋Š”๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  struct๋กœ ๋ชจ๋ธ์„ ์„ ์–ธํ•œ๋‹ค.

rightImageView์— ๋Œ€ํ•œ ์„ค์ •์€ ์ด๋ฏธ ๋งˆ์ณค์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๊ตฌ์„ฑ์š”์†Œ์ธ leftLabel์— ๋Œ€ํ•ด ์š”์†Œ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

 

class GeneralViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var model = [[GeneralModel]]()
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model[section].count
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return model.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "GeneralCell", for: indexPath) as! GeneralCell
        
        cell.leftLabel.text = model[indexPath.section][indexPath.row].leftTitle
        
        cell.rightImageView.tintColor = .lightGray
        
        return cell
    }

 ๊ทธ ๋‹ค์Œ์œผ๋กœ TableView์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค.

Model๋กœ 2์ค‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ๊ฐ ์œ„์น˜์— ๋Œ€ํ•ด ์„ค์ •ํ•œ๋‹ค.

 

@IBOutlet weak var generalTableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        generalTableView.delegate = self
        generalTableView.dataSource = self
        
        self.title = "General"
        self.navigationController?.navigationBar.prefersLargeTitles = false
        
        model.append([GeneralModel(leftTitle: "About")])
        
        model.append([GeneralModel(leftTitle: "Keyboard"),
        GeneralModel(leftTitle: "Game Controller"),
        GeneralModel(leftTitle: "Fonts"),
        GeneralModel(leftTitle: "Language & Region"),
        GeneralModel(leftTitle: "Dictionary")])
        
        model.append([GeneralModel(leftTitle: "Reset")])
        
        self.view.backgroundColor = UIColor(white: 245/255, alpha: 1)
        generalTableView.backgroundColor = UIColor(white: 245/255, alpha: 1)
    }
}

๋งˆ์ง€๋ง‰์œผ๋กœ viewDidLoad์—์„œ Model์— ์š”์†Œ๋“ค์˜ ๋‚ด์šฉ์„ ์ €์žฅํ•ด์ฃผ๊ณ  ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

๋˜, ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”์˜ ํƒ€์ดํ‹€๋“ฑ์„ ์„ค์ •ํ•ด์ค€๋‹ค.

 

์ด์ œ ViewController์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊นŒ์ง€ ํ•ด์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด

if indexPath.section == 1 && indexPath.row == 0 {
   if let generalVC = UIStoryboard(name: "GeneralViewController", bundle: nil).instantiateViewController(withIdentifier: "GeneralViewController") as? GeneralViewController {
      self.navigationController?.pushViewController(generalVC, animated: true)
   }
 }

 

์ด๋ ‡๊ฒŒ ์™„์„ฑ!!

 

 

4. Profile ์„ค์ •

 

 

 

 

ํ”„๋กœํŒŒ์ผ ๋ถ€๋ถ„์€ ์ด๋ ‡๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

๊ณ ๋ คํ•ด์•ผํ•  ์‚ฌํ•ญ์€

 

1. ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.

2. ํ™”๋ฉด์ด ์•„๋ž˜์—์„œ ์œ„๋กœ ์˜ฌ๋ผ์˜จ๋‹ค.

3. ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„๋•Œ๋Š” Next(๋‹ค์Œ) ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋˜์ง€์•Š๋Š”๋‹ค.

 

์ •๋„์ด๋‹ค.

 

 

 

 

 

 

๋จผ์ € MyIDViewController๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ swift์™€ xibํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 

์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์—ด์‹ฌํžˆ ๋ทฐ์˜ ๋ชจ์Šต์„ ์นดํ”ผํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  MyIDViewController.swift์—์„œ ๋ทฐ์˜ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ์•„์›ƒ๋ ›์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์•ก์…˜์œผ๋กœ ๊ฐ€์ ธ์™€์„œ

์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋”ฉํ•œ๋‹ค.

 

import UIKit

class MyIDViewController: UIViewController {

    @IBOutlet weak var nextBtn: UIButton!{
        didSet{
            nextBtn.isEnabled = false
        }
    }
    @IBOutlet weak var emailTextField: UITextField!
    
    @IBAction func doCancel(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
    
    @IBOutlet weak var cancelBtn: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        emailTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
        
//        textFieldDidChange(sender: emailTextField)
    }

    @objc func textFieldDidChange(sender: UITextField){
       
        if sender.text?.isEmpty == true {
            nextBtn.isEnabled = false
        } else {
            nextBtn.isEnabled = true
        }
        
    }
}

๊ฐ€์ ธ์˜ฌ ์š”์†Œ๋Š” ์ด ์„ธ๊ฐ€์ง€์ด๋‹ค.

Cancel ๋ฒ„ํŠผ, Next ๋ฒ„ํŠผ, Email์ž…๋ ฅ ํ…์ŠคํŠธ ํ•„๋“œ.

 

Cancel ๋ฒ„ํŠผ์€ ๋ˆŒ๋ฆฌ๋ฉด dismiss ๋˜๋„๋ก ์„ค์ •ํ•˜๊ณ ,

EmailTextField์™€ Next ๋ฒ„ํŠผ์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฉ”์ผ ํ•„๋“œ ์•ˆ์— ๊ธ€์ž๊ฐ€ ์žˆ์„ ๋•Œ Next ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™” ์‹œํ‚ค๊ณ , ์—†์œผ๋ฉด ๋น„ํ™œ์„ฑํ™” ์‹œํ‚ค๋Š” ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. ๊ทธ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๊ฐ€ textFieldDidChangeํ•จ์ˆ˜์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ViewController์—์„œ ํ”„๋กœํŒŒ์ผ ๋ถ€๋ถ„์„ ๋ˆŒ๋ €์„ ๋•Œ ํ™”๋ฉด์ด ๋„˜์–ด๊ฐ€๋„๋ก 

์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

if indexPath.section == 0 && indexPath.row == 0 {
    let myidVC = MyIDViewController(nibName: "MyIDViewController", bundle: nil)
            
    self.present(myidVC, animated: true, completion: nil)      
 }

์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐํ–ˆ๋‹ค. 

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค.

 

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค์€ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฌ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ๋ชจ๋‹ฌ์ฒ˜๋Ÿผ ์•„๋ž˜์—์„œ ์œ„๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

๊ทธ๋ž˜์„œ present๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์ด ๋„˜์–ด๊ฐ€๊ฒŒ ํ•˜๊ณ  ์žˆ๋‹ค.

 

์™„์„ฑ๋œ ๋ชจ์Šต์ด๋‹ค.

 

 

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์•„์ดํฐ setting app clone ์‹ค์Šต์ด ๋๋‚ฌ๋‹ค ^_^

 

 


Reference

 

https://www.inflearn.com/course/uikit-ios14/dashboard

 

UIKit - iOS14 ์‹ค๋ฌด ๊ฐ€์ด๋“œ <iOS์•ฑ ์ง„์งœ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ> - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

UIKit - iOS14 ์‹ค๋ฌด ์•ฑ ๊ฐ€์ด๋“œ ์ž…๋ฌธ์ž๋ฅผ ์œ„ํ•œ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ํƒ„ํƒ„ํ•œ ์„ค๋ช…์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋ ฅ์ž๋“ค๋„ ๋†“์น˜๊ธฐ ์‰ฌ์šด ๊ฐœ๋…๋“ค์„ ํ™•์‹คํ•˜๊ฒŒ ์žก์•„๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ์•ฑ์„ ํ™•์‹คํ•˜๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋ก

www.inflearn.com

 

LIST

'๐Ÿ’ก work work work > swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

swift ์‹ค์Šต - 5 : Photo Gallery App  (0) 2022.02.22
swift ์‹ค์Šต - 4 : OnBoardingView  (0) 2022.02.21
swift ์‹ค์Šต - 3.1 : Setting App Clone  (0) 2022.02.14
swift ์‹ค์Šต - 2 : Dispatch Queue  (0) 2022.02.14
swift ์‹ค์Šต - 1 : Passing Data  (0) 2022.02.09

๋Œ“๊ธ€