Jiwift

[iOS/Swift] Enum을 사용한 TabBar Item 관리 본문

iOS Dev/Swift

[iOS/Swift] Enum을 사용한 TabBar Item 관리

지위프트 2024. 5. 1. 14:02
반응형

[iOS/Swift] Enum을 사용한 TabBar Item 관리

 

 안녕하세요. 이번에는 Enum을 사용해서 TabBarViewController의 TabBarItem을 관리하는 방법을 소개하려고합니다. Storyboard를 사용하면 필요 없을 수도 있습니다. 

 

 그리고 더 좋은 방법이 있을 수 있습니다. 읽어보시다 별로면 새로운 방법을 추천해주세요.!!

 

 저는 Storyboard 없이 코드 베이스로 작업을하고있었습니다. 

 

import UIKit

class BaseTabBarController: UITabBarController, UITabBarControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        self.setTabBar()
        self.delegate = self
    }
    
    private func setTabBar() {
        // 각각의 아이템에 대한 ViewController 생성
        self.viewControllers = [TabBarType.home.viewController,
                                TabBarType.stock.viewController,
                                TabBarType.analyze.viewController,
                                TabBarType.more.viewController]
        
        self.tabBar.backgroundColor = .baseWhite
    }
    
    // 탭이 선택될 때 호출되는 메서드
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        Vibration.medium.vibrate()
    }
}

 

 위 코드는 제가 생성한 TabBarController입니다. 탭바를 사용하기 위해서는 ViewController를 연결해주어야합니다. 그래서 그걸 enum으로 묶어서 관리해보려고 생각했습니다. (그냥 TabBarController 클래스에서 생성해도 문제는 없어보이긴함..)

 

 위 코드 중간에 setTabBar 함수에서 enum을 사용해서 viewcontroller를 설정하는 것을 볼 수 있습니다.

 

 

Enum 시작

case home
case vc1
case vc2
case more

 enum의 case는 위 처럼 4가지를 설정하였습니다.

 

private var itemTitle: String {
    switch self {
    case .home:
        return "홈"
    case .vc1:
        return "화면1"
    case .vc2:
        return "화면2"
    case .more:
        return "더보기"
    }
}

private var itemImage: UIImage {
    switch self {
    case .home:
        return UIImage(systemName: "house.fill")!
    case .vc1:
        return UIImage(systemName: "chart.bar.doc.horizontal.fill")!
    case .vc2:
        return UIImage(systemName: "chart.pie.fill")!
    case .more:
        return UIImage(systemName: "ellipsis")!
    }
}

 그리고 TabBar Item에서 사용할 Title과 이미지를 선언해주었습니다. 

 

private var tabBarItem: UITabBarItem {
    switch self {
    case .home:
        return UITabBarItem(title: self.itemTitle,
                            image: self.itemImage, selectedImage: nil)
    case .vc1:
        return UITabBarItem(title: self.itemTitle,
                            image: self.itemImage, selectedImage: nil)
    case .vc2:
        return UITabBarItem(title: self.itemTitle,
                            image: self.itemImage, selectedImage: nil)
    case .more:
        return UITabBarItem(title: self.itemTitle,
                            image: self.itemImage, selectedImage: nil)
    }
}

 그리고 이미지와 Title을 tabarItem에서 사용합니다. 

 

var viewController: UIViewController {
    switch self {
    case .home:
        let vc: HomeViewController = .init()
        vc.tabBarItem = self.tabBarItem
        return vc
    case .vc1:
        let vc: ViewController1 = .init()
        vc.tabBarItem = self.tabBarItem
        return vc
    case .vc2:
        let vc: ViewController2 = .init()
        vc.tabBarItem = self.tabBarItem
        return vc
    case .more:
        let vc: MoreViewController = .init()
        vc.tabBarItem = self.tabBarItem
        return vc
    }
}

 위에서 생성한 TabBarItem을 ViewController의 Item으로 설정합니다. 

 

 이렇게 한번 작성해두면 Enum만 수정하면 TabBarItem을 편하게 관리할 수 있습니다. 

 

 더 좋은 방법이 있으면 추천해주세요.!!

 

 

아래는 전체 코드입니다.

enum TabBarType {
    case home
    case vc1
    case vc2
    case more
    
    var viewController: UIViewController {
        switch self {
        case .home:
            let vc: HomeViewController = .init()
            vc.tabBarItem = self.tabBarItem
            return vc
        case .vc1:
            let vc: ViewController1 = .init()
            vc.tabBarItem = self.tabBarItem
            return vc
        case .vc2:
            let vc: ViewController2 = .init()
            vc.tabBarItem = self.tabBarItem
            return vc
        case .more:
            let vc: MoreViewController = .init()
            vc.tabBarItem = self.tabBarItem
            return vc
        }
    }
    
    private var tabBarItem: UITabBarItem {
        switch self {
        case .home:
            return UITabBarItem(title: self.itemTitle,
                                image: self.itemImage, selectedImage: nil)
        case .vc1:
            return UITabBarItem(title: self.itemTitle,
                                image: self.itemImage, selectedImage: nil)
        case .vc2:
            return UITabBarItem(title: self.itemTitle,
                                image: self.itemImage, selectedImage: nil)
        case .more:
            return UITabBarItem(title: self.itemTitle,
                                image: self.itemImage, selectedImage: nil)
        }
    }
    
    private var itemTitle: String {
        switch self {
        case .home:
            return "홈"
        case .vc1:
            return "화면1"
        case .vc2:
            return "화면2"
        case .more:
            return "더보기"
        }
    }
    
    private var itemImage: UIImage {
        switch self {
        case .home:
            return UIImage(systemName: "house.fill")!
        case .vc1:
            return UIImage(systemName: "chart.bar.doc.horizontal.fill")!
        case .vc2:
            return UIImage(systemName: "chart.pie.fill")!
        case .more:
            return UIImage(systemName: "ellipsis")!
        }
    }
}
반응형