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")!
}
}
}
반응형