본문 바로가기

UIKIT

탭바뷰컨트롤러에서 액션시트 나오게 하는 방법

 탭바의 탭바뷰컨트롤러를 누르면 탭바를 잠까 멈췄다가 액션시트로 처리하는 방법

import UIKit

class MainTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let homeVC = HomeViewController()
        let newFeedVC = FeedViewController()
        let calendarVC = CalendarViewController()
        
        
        homeVC.tabBarItem.image = UIImage(systemName: "square.stack.3d.up")
        homeVC.tabBarItem.selectedImage = UIImage(systemName: "square.stack.3d.up.fill")
        
        newFeedVC.tabBarItem.image = UIImage(systemName: "checklist.unchecked")
        newFeedVC.tabBarItem.selectedImage = UIImage(systemName: "checklist")
        
        calendarVC.tabBarItem.image = UIImage(systemName: "calendar")
        
        
        homeVC.tabBarItem.title = "Home"
        newFeedVC.tabBarItem.title = "Feed"
        calendarVC.tabBarItem.title = "Calendar"
        
        setViewControllers([homeVC, newFeedVC, calendarVC], animated: true)
        
        // TabBarController의 Delegate 설정
        self.delegate = self
        
    }
    
}

extension MainTabBarController: UITabBarControllerDelegate {
    
    // shouldSelect -> 탭이 선택되기 직전에 호출 
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        
        // newFeedVC를 선택한 경우 ActionSheet 표시
        if let index = tabBarController.viewControllers?.firstIndex(of: viewController), index == 1 {
            presentActionSheet()
            return false // 탭 선택 방지
        }
        return true // 다른 탭은 정상 동작
    }
    
    // MARKL: - ActionSheet
    private func presentActionSheet() {
        
        let actionSheet = UIAlertController(
            title: "무슨 내용을 적을래요?",
            message: "어떤 내용이든 상관없어요 ^___^",
            preferredStyle: .actionSheet
        )
                
        actionSheet.addAction(UIAlertAction(
            title: "피드 작성하기",
            style: .default,
            handler: { action in
                let feedVC = FeedViewController()
                let navFeedVC = UINavigationController(rootViewController: feedVC)
                navFeedVC.modalPresentationStyle = .fullScreen
                self.present(navFeedVC, animated: true)
            }
        ))
        
        actionSheet.addAction(UIAlertAction(
            title: "취소",
            style: .cancel,
            handler: nil))
        
        self.present(actionSheet, animated: true)
    }
}