Swift 내에서 프로그래밍 방식으로 탭 간 전환


83

iOS 앱이 시작될 때보기를 다른 탭으로 전환하는 코드를 작성해야합니다 (예를 들어 두 번째 탭은 기본적으로 첫 번째 탭이 아닌 탭으로 표시됨).

저는 Swift를 처음 사용하며 다음을 해결했습니다.

  • 코드는 아마도 첫 번째 탭의 ViewController에있는 override func viewDidLoad () 함수에 있어야합니다.

  • 다음 코드는 두 번째 ViewController를 보여 주지만 맨 아래에 탭 표시 줄이 없습니다 (vcOptions는 두 번째 ViewController 탭 항목입니다.

let vc : AnyObject! = self.storyboard.instantiateViewControllerWithIdentifier("vcOptions")
self.showViewController(vc as UIViewController, sender: vc)

대답은 UITabbarController.selectedIndex = 1을 사용하는 데 있다고 생각하지만 이것을 구현하는 방법은 확실하지 않습니다.

답변:


142

귀하의 경우 window rootViewController이다 UITabbarController(대부분의 경우입니다) 당신은에 액세스 할 수 있습니다 tabbardidFinishLaunchingWithOptionsAppDelegate파일.

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.

    if let tabBarController = self.window!.rootViewController as? UITabBarController {
        tabBarController.selectedIndex = 1
    }

    return true
}

그러면에서 index주어진 (1) 탭이 열립니다 selectedIndex.

당신이 이렇게하면 viewDidLoad당신의 firstViewController, 당신은 플래그 또는 선택된 탭을 추적하는 또 다른 방법으로 관리해야합니다. 최고의 장소에서이 작업을 수행하는 didFinishLaunchingWithOptions사용자의 AppDelegate파일 또는 rootViewController사용자 정의 클래스 viewDidLoad.


나를 지적하는 Tx! 그러나, 나는 함께 결국 : if let tababarController = self.window!.rootViewController as! UITabBarController? { tababarController.selectedIndex = tabIndex }
마르신 Świerczyński을

당신은 당신의 다음을 할 수 없습니다 TabBarViewController: class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() selectedIndex = 1 }이 경우 OP가 수행하려는 보조 탭을 선택합니다.
Korpel

그냥 교체 as UITabBarController와 함께 as! UITabBarController그리고 대한 답변을 .. 너무 스위프트 3에 감사를 작동합니다!
Mamta

31

1. UITabBarController를 대체하는 새 클래스를 만듭니다. 예 :

class xxx: UITabBarController {
override func viewDidLoad() {
        super.viewDidLoad()
}

2. viewDidLoad () 함수에 다음 코드를 추가합니다.

self.selectedIndex = 1; //set the tab index you want to show here, start from 0

3. Storyboard로 이동하여 Tab Bar Controller의 Custom Class를이 새 클래스로 설정합니다. (사진의 예로서 MyVotes1)

여기에 이미지 설명 입력


이것은 Xcode 8.2 swift 3에서 저에게 효과적이었습니다. 감사합니다! 내 앱에는 5 개의 탭 중 중간 (3 번째) 탭이 표시됩니다. class PatientTabBarController : UITabBarController {재정의 func viewDidLoad () {super.viewDidLoad () selectedIndex = 2}}
Brian

28

스위프트 3

index 0tabBarController 의 기본 뷰 컨트롤러 ( ) 에이 코드를 추가 할 수 있습니다 .

    override func viewWillAppear(_ animated: Bool) {
        _ = self.tabBarController?.selectedIndex = 1
    }

로드시 자동으로 탭을 목록의 두 번째 항목으로 이동하지만 사용자가 언제든지 해당보기로 수동으로 돌아갈 수 있습니다.


3
대신 "tabBarController? .selectedIndex = 1"을 사용하지 않는 이유는 무엇입니까?
Ahmadreza

항상 전화해야합니다 super.viewWillAppear(). 또한 할당 _ = 이 필요하지 않습니다.
Koen.

20

viewController는 UITabBarControllerDelegate 의 자식이어야합니다 . 따라서 SWIFT 3 에 다음 코드를 추가하기 만하면됩니다.

self.tabBarController?.selectedIndex = 1

18

@codester의 답변을 확장하려면 확인한 다음 할당 할 필요가 없으며 한 단계로 수행 할 수 있습니다.

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
    // Override point for customization after application launch.

    if let tabBarController = self.window!.rootViewController as? UITabBarController {
        tabBarController.selectedIndex = 1
    }

    return true
}

5

일반적인 애플리케이션에는 UITabBarController가 있으며 3 개 이상의 UIViewController를 탭으로 포함합니다. 이 경우 UITabBarController를 YourTabBarController로 서브 클래 싱 한 경우 다음과 같이 간단히 선택한 인덱스를 설정할 수 있습니다.

selectedIndex = 1 // Displays 2nd tab. The index starts from 0.

다른보기에서 YourTabBarController로 이동하는 경우 해당보기 컨트롤러의 prepare (for segue :) 메서드에서 다음을 수행 할 수 있습니다.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        if segue.identifier == "SegueToYourTabBarController" {
            if let destVC = segue.destination as? YourTabBarController {
                destVC.selectedIndex = 0
            }
        }

Xcode 10 및 Swift 4.2에서 탭 설정 방법을 사용하고 있습니다.


4

스위프트 5

//MARK:- if you are in UITabBarController 
self.selectedIndex = 1

또는

tabBarController?.selectedIndex = 1

2

업데이트하기 위해 iOS 13에 따라 이제 SceneDelegates가 있습니다. 따라서 다음과 같이 SceneDelegate.swift에 원하는 탭 선택을 넣도록 선택할 수 있습니다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, 
               willConnectTo session: UISceneSession, 
               options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }

        if let tabBarController = self.window!.rootViewController as? UITabBarController {
            tabBarController.selectedIndex = 1
        }

    }

0

버튼 누름 등에 대한 응답과 같이 특정 뷰 컨트롤러의 일부로 작성하는 코드에서이 작업을 수행하려면 다음과 같이 할 수 있습니다.

@IBAction func pushSearchButton(_ sender: UIButton?) {
    if let tabBarController = self.navigationController?.tabBarController  {
        tabBarController.selectedIndex = 1
    }
}

또한 UITabBarControllerDelegate 메서드를 사용하여 탭 전환을 처리하는 코드를 추가 할 수도 있습니다. 각 탭의 기본보기 컨트롤러에서 태그를 사용하여 현재 위치를 확인하고 그에 따라 조치를 취할 수 있습니다. 예 :

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    
    // if we didn't change tabs, don't do anything
    if tabBarController.selectedViewController?.tabBarItem.tag ==  viewController.tabBarItem.tag {
        return false
    }
    
    if viewController.tabBarItem.tag == 4096 { // some particular tab
        // do stuff appropriate for a transition to this particular tab
    }
    else if viewController.tabBarItem.tag == 2048 { // some other tab
        // do stuff appropriate for a transition to this other tab
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.