๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[iOS] Swift ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'SideMenu'๋กœ ์‚ฌ์ด๋“œ๋ฐ” ๊ตฌํ˜„ํ•˜๊ธฐ - 2 ๋ณธ๋ฌธ

๊ธฐํƒ€/iOS

[iOS] Swift ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'SideMenu'๋กœ ์‚ฌ์ด๋“œ๋ฐ” ๊ตฌํ˜„ํ•˜๊ธฐ - 2

.23 2021. 8. 21. 11:58

Swift ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 'SideMenu'๋กœ ์‚ฌ์ด๋“œ๋ฐ” ๊ตฌํ˜„ํ•˜๊ธฐ - 1 ์—์„œ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

 

1.3 ์‚ฌ์ด๋“œ๋ฉ”๋‰ด ํ™”๋ฉด ๊ตฌ์„ฑ

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ ์•ˆ๋„ฃ์€ ๋‚ด์šฉ์ด ์žˆ์–ด์„œ....

์‚ฌ์ด๋“œ๋ฉ”๋‰ด์— ๋ณด์ผ ํ™”๋ฉด์„ ์›ํ•˜๋Š” ๋ชจ์Šต๋Œ€๋กœ ์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ๊ตฌ์„ฑํ•ด์ค€๋‹ค. ๋‚ด์šฉ์ด ๋ณด์ผ Label ํ•˜๋‚˜์™€ Button ํ•˜๋‚˜๋ฅผ ๋„ฃ์–ด์คฌ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์ง„์งœ ๊ตฌ์„ฑ ์™„๋ฃŒ!


2. ์ฝ”๋“œ ์„ค์ •

2.1 ์ฝ”๋“œ ์ดˆ๊ธฐ ์„ค์ •

ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด์—์„œ New Group์„ ๋‘๋ฒˆ ์ถ”๊ฐ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ , UITableViewCell ํ˜•์‹์˜ MenuItemCell.swift ํŒŒ์ผ๊ณผ UIViewController ํ˜•์‹์˜ MainController.swift, SideMenuController.swift ํŒŒ์ผ ๋‘๊ฐœ๋ฅผ ๊ฐ๊ฐ View, Controller ํด๋”์— ์ƒ์„ฑํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์ดˆ๊ธฐ ํ™”๋ฉด์˜ View Controller์˜ Class๋Š” MainController๋กœ, Side Menu Navigation Controller์— ๋”ธ๋ ค์žˆ๋Š” View Controller์˜ Class๋Š” SideMenuController๋กœ ์„ค์ •ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  SideMenuController ๋‚ด์˜ Table View Cell์˜ Class๋Š” MenuItemCell์„ ์„ค์ •ํ•ด์ฃผ๊ณ , Identifier์—๋Š” ํŽธํ•œ ์ด๋ฆ„์„ ํ• ๋‹นํ•ด์ค€๋‹ค. ๋‚˜๋Š” ํด๋ž˜์Šค ๊ทธ๋Œ€๋กœ MenuItemCell๋กœ ํ•˜์˜€๋‹ค.

 

Main Controller์™€ Side Menu Navigation Controller ๋ชจ๋‘ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ด์ค€ ๋‹ค์Œ, ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ Assistant๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋“ค์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

 

2.2 ์ฝ”๋“œ

์‚ฌ์ด๋“œ๋ฉ”๋‰ด์™€ ๊ด€๋ จํ•ด์„œ MainController.swift์—์„œ๋Š” ์ž‘์—…ํ•ด์ค„ ๋ณ„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์—†๊ณ , SideMenuController.swift ํŒŒ์ผ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

 

// SideMenuController.swift
import UIKit

class SideMenuController: UIViewController {
    var items = ["๊ฒŒ์‹œํŒ1", "๊ฒŒ์‹œํŒ2", "๊ฒŒ์‹œํŒ3", "๊ฒŒ์‹œํŒ4"]

    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        talbeView.delegate = self
    }
}

extension SideMenuController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MenuItemCell", for: indexPath) as! MenuItemCell
        cell.menuLabel?.text = items[indexPath.row]
        
        return cell
    }
    
}

 

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.(๋ฒ„ํŠผ์€ ์ž„์˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์Œ)

 

 


3. ๋ถ€๊ฐ€ ์„ค์ •

3.1 ๋‹ค์Œ ํ™”๋ฉด ์—ฐ๊ฒฐ

๊ฒŒ์‹œํŒ์„ ์„ ํƒํ–ˆ์œผ๋ฉด ๋‹ค์Œ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€์•ผ๋˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์–ด์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ, ์ถ”๊ฐ€์ ์œผ๋กœ ๋„ฃ์—ˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ณด๋“œ์— Navigation Controller๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Root View Controller Scene์„ ์‚ญ์ œํ•˜๊ณ  View Controller๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ๊ทธ๋Ÿผ Main.storyboard์— ์ด 6๊ฐœ์˜ ์”ฌ์ด ์ƒ์„ฑ๋œ๋‹ค.

๋‹จ์ˆœํžˆ ํ™”๋ฉด์ด ๋งž๊ฒŒ ๋„˜์–ด๊ฐ€๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์—, View Controller ๋‚ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด Label ํ•˜๋‚˜๋งŒ ๋„ฃ์–ด์คฌ๋Š”๋ฐ ์‹ค์ œ๋กœ๋Š” ์ž„์˜๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

 

Controller ํด๋” ๋‚ด์— MenuController.swift ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ค€ ๋’ค, ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์ƒˆ๋กœ ๋งŒ๋“  ์ปจํŠธ๋กค๋Ÿฌ์™€ ์š”์†Œ๋“ค์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

 

๋งŒ๋“ค์–ด์ค€ ๋’ค ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ Side Menu Controller Scene๊ณผ Menu Controller Scene ๋‘˜์„ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ , ์—ฐ๊ฒฐ์„ (Segue)์˜ Identifier๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๊ณ , MenuController.swiftํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ค€๋‹ค.

// MenuController.swift
import UIKit

class MenuController: UIViewController {
    var titleText: String? = nil
    @IBOutlet weak var titleLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        titleLabel.text = titleText
    }
}

 

๋‹ค์‹œ SideMenuController.swift๋กœ ๋Œ์•„์™€์„œ, ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

//  SideMenuController.swift
import UIKit

class SideMenuController: UIViewController {
    var items = ["๊ฒŒ์‹œํŒ1", "๊ฒŒ์‹œํŒ2", "๊ฒŒ์‹œํŒ3", "๊ฒŒ์‹œํŒ4"]

    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        tableView.delegate = self
    }
    
    // ์ถ”๊ฐ€ ์ฝ”๋“œ
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "linkSelected" {
            let vc = segue.destination as! MenuController
            vc.titleText = sender as! String
        }
    }
    
}

extension SideMenuController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MenuItemCell", for: indexPath) as! MenuItemCell
        cell.menuLabel?.text = items[indexPath.row]
        
        return cell
    }
    
}

// ์ถ”๊ฐ€ ์ฝ”๋“œ
extension SideMenuController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let title = items[indexPath.row]
        performSegue(withIdentifier: "linkSelected", sender: title)
    }
}

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค. ๋ผ๋ฒจ์ด ์ž˜๋ ค๋ณด์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿด ๋• ๋ผ๋ฒจ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ํ‚ค์šฐ๋ฉด ๋œ๋‹ค.

 

3.2 ์ถ”๊ฐ€ ๊ธฐ๋Šฅ

๊ฒŒ์‹œํŒ1์— ๊ฐ”๋‹ค๊ฐ€ ๊ฒŒ์‹œํŒ2๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”์ธ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ฑฐ์ณค๋‹ค๊ฐ€ ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ๊ฒŒ์‹œํŒ ์–ดํ”Œ๋“ค์ฒ˜๋Ÿผ ๊ฒŒ์‹œํŒ ๋‚ด์—์„œ ๋‹ค๋ฅธ ๊ฒŒ์‹œํŒ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Menu Controller Scene์˜ ์™ผ์ชฝ์— bar button item์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ทธ๋Ÿฐ ๋’ค์— ๋˜‘๊ฐ™์ด Menu Controller ๋‚ด์˜ ์™ผ์ชฝ ๋ฐ” ๋ฒ„ํŠผ์„ Side Menu Navigation Controller์™€ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค!

๊ทธ ์™ธ์— ๋ฉ”๋‰ด ํ™”๋ฉด์˜ ์ƒ๋‹จ์— ํ™ˆ๋ฒ„ํŠผ์„ ์ง‘์–ด๋„ฃ์–ด ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ธฐ๋Šฅ, ์‚ฌ์ด๋“œ๋ฉ”๋‰ด์˜ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๊ด€์‹ฌ ๊ฒŒ์‹œํŒ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ ๋“ฑ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋„ฃ์–ด ์™„์„ฑํ•œ ์ตœ์ข… ์˜ˆ์ œ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

 

 

์ „์ฒด ์†Œ์Šค์ฝ”๋“œ : https://github.com/miiinnn23/SideMenuTutorial

Comments