프로그래밍 방식으로 TabBar 탭보기로 전환 하시겠습니까?


159

UIButtoniPhone 앱에 하나의 탭보기가 있고의 탭 막대에서 다른 탭을 열고 싶다고 가정 해 봅시다 TabBarController. 이를 위해 코드를 어떻게 작성합니까?

기존보기를 언로드하고 특정 탭보기를로드한다고 가정하지만 코드를 정확하게 작성하는 방법을 모르겠습니다.


: 나는 위의 방법, 사람의 내 [질문] 도움 [1] [1]에 문제가 stackoverflow.com/questions/19742416/...
로마 Simenok

답변:


399

Swift 또는 Objective-C에서이 코드를 사용해보십시오

빠른

self.tabBarController.selectedIndex = 1

목표 -C

[self.tabBarController setSelectedIndex:1];

8
인덱스가 자세히보기 컨트롤러 내의 탭에 매핑되면 (탭이 5 개 이상 있어야 함) 작동하지 않습니다. 이 경우을 사용하십시오 -setSelectedViewController:.
Joe D' Andrea

이 작업을 수행하고 탭을 성공적으로 변경 한 후에는 더 이상 탭 표시 줄을 정상적으로 선택할 수 없습니다. 업데이트 : 이것은 프로그래밍 방식으로 탭을 교환하기 직전에 popToRootViewController를 호출하는 것과 관련이 있습니다.
Adam Johns

그러나 탭을 전환하려는 경우 Self가 작동하지 않는 방법. 사용자가 확인을 누르면 탭 3을 클릭하고 alertView를 표시한다고 가정하면 탭 1로 다시 전환하고 싶습니다. 자기는 현재 대상이 아닌 것으로 옳지 않을 것입니다. 맞습니까?
Alix

이것은 잘 작동하지만 탭을 전환하는 동안 데이터를 전달해야합니다. 탭에서 탭을 전환하자마자 업데이트 해야하는 레이블이 탭에 있습니다.! 이것에 대한 쉬운 해결책?
Md Rais

@AdamJohns 어떻게 문제를 해결하기 위해 관리 했습니까? 네이티브 tabBar처럼 동작하도록 두 번 클릭하면 rootViewController가 나타납니다.
와카 스

20

탭은 0부터 시작하여 색인화됩니다. 따라서 다음 코드 스 니펫이 작동합니다.

tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];

막대의 다섯 번째 탭으로 이동합니다.


12

내 의견이다 selectedIndex또는 사용이 objectAtIndex탭을 전환 할 수있는 가장 좋은 방법은 필요하지 않습니다. 탭을 재정렬하면 하드 코딩 된 인덱스 선택으로 인해 이전 앱 동작이 엉망이 될 수 있습니다.

전환하려는 뷰 컨트롤러의 객체 참조가있는 경우 다음을 수행 할 수 있습니다.

tabBarController.selectedViewController = myViewController

물론 반드시 myViewController의 목록에 있는지 확인해야합니다 tabBarController.viewControllers.


더 많은 NavController를 선택해야했고 내가 아는 한 그렇게하는 유일한 방법입니다
Ossir

9

selectedIndexUITabBarController 의 속성을 적절한 색인으로 설정하기 만하면 사용자가 탭 버튼을 탭한 것처럼보기가 변경됩니다.


6
한 가지 작은 차이점은 사용자 전환 탭을 알릴 수있는 대리자 메서드가 호출되지 않는다는 것입니다.
Brad The App Guy

3
selectedIndex인덱스가 4보다 크면 설정 이 작동하지 않지만 작동하지 않습니다 selectedViewController.
bugloaf

3

나는 Disco S2가 제안한 것을 시도했지만 가까이 있었지만 이것이 나를 위해 일한 결과입니다. 다른 탭 내에서 작업을 완료 한 후 호출되었습니다.

for (UINavigationController *controller in self.tabBarController.viewControllers)
{
    if ([controller isKindOfClass:[MyViewController class]])
    {
        [self.tabBarController setSelectedViewController:controller];
        break;
    }
}

2

탭을 이동할 수있는 경우 코드는 다음과 같습니다.

for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
            if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
                [self.tabBarController setSelectedViewController:controller];
                break;
            }
        }

2

Stuart Clark의 솔루션과 같지만 Swift 3의 경우 :

func setTab<T>(_ myClass: T.Type) {
    var i: Int = 0
    if let controllers = self.tabBarController?.viewControllers {
        for controller in controllers {
            if let nav = controller as? UINavigationController, nav.topViewController is T {
                break
            }
            i = i+1
        }
    }
    self.tabBarController?.selectedIndex = i
}

다음과 같이 사용하십시오.

setTab(MyViewController.self)

내 tabController는 navigationController 뒤에있는 viewController에 링크되어 있습니다. navigationController가 없으면 다음과 같습니다.

if let controller is T {

루핑없이 탐색 컨트롤러가없는 경우 : func selectViewController <ViewControllerModel> (type : ViewControllerModel.Type) {self.selectedViewController = self.viewControllers? .first (여기서 : {viewController의 viewController는 ViewControllerModel입니다.})}
dev_exo

1

IB를 연결하는 방법에 덜 의존하는 강력한 솔루션을 생각하면서 인덱스 대신 클래스별로 표시되는 탭을 지정할 수 있기를 원했습니다. Disco 또는 Joped의 솔루션이 작동하지 않아서이 방법을 만들었습니다.

-(void)setTab:(Class)class{
    int i = 0;
    for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
        if ([controller isKindOfClass:class]){
            break;
        }
        i++;
    }
    self.tabBarContontroller.selectedIndex = i;
}

당신은 이것을 다음과 같이 부릅니다.

[self setTab:[YourClass class]];

이것이 누군가에게 도움이되기를 바랍니다.


이것은 훌륭하게 작동했습니다! 다른 답변으로 Swift3 용으로 다시 작성했습니다.
Json

1

내 문제는 조금 다릅니다. 첫 번째 tabBar에서 하나의 childViewController에서 두 번째 tabBar의 home viewController로 전환해야합니다. 위층에 제공된 솔루션을 사용하기 만하면됩니다.

tabBarController.selectedIndex = 2

그러나 두 번째 tabBar의 홈 페이지로 전환하면 내용이 보이지 않습니다. 그리고 디버깅 할 때 viewDidAppear, viewWillAppear, viewDidLoad는 호출되지 않습니다. 내 솔루션은 UITabBarController에 다음 코드를 추가하는 것입니다.

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

0

AppDelegate.m파일 에서 사용 :

(void)tabBarController:(UITabBarController *)tabBarController
 didSelectViewController:(UIViewController *)viewController
{

     NSLog(@"Selected index: %d", tabBarController.selectedIndex);

    if (viewController == tabBarController.moreNavigationController)
    {
        tabBarController.moreNavigationController.delegate = self;
    }

    NSUInteger selectedIndex = tabBarController.selectedIndex;

    switch (selectedIndex) {

        case 0:
            NSLog(@"click me %u",self.tabBarController.selectedIndex);
            break;
        case 1:
            NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
            break;

        default:
            break;

    }

}

0

Stuart Clark의 솔루션과 유사하지만 Swift 3의 경우 복원 식별자를 사용하여 올바른 탭을 찾으십시오.

private func setTabById(id: String) {
  var i: Int = 0
  if let controllers = self.tabBarController?.viewControllers {
    for controller in controllers {
      if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
        break
      }
      i = i+1
    }
  }
  self.tabBarController?.selectedIndex = i
}

다음과 같이 사용하십시오 (특정 viewController 및 복원 ID에 대해 스토리 보드에서 "인간"및 "로봇"도 설정해야하거나 스토리 보드 ID를 사용하고 "스토리 보드 ID 사용"을 복원 ID로 확인).

struct Tabs {
    static let Humans = "Humans"
    static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)

내 tabController는 navigationController 뒤에있는 viewController에 링크되어 있습니다. navigationController가 없으면 다음과 같습니다.

if controller.restorationIdentifier == id {

0
import UIKit

class TabbarViewController: UITabBarController,UITabBarControllerDelegate {

//MARK:- View Life Cycle

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
    yourView.popToRootViewController(animated:false)
}



}

1
일반적으로 익명 코드 행을 게시하는 대신 솔루션을 설명하는 것이 좋습니다. 당신이 읽을 수있는 내가 좋은 답변 쓰기 어떻게 도하고, 전체 코드 기반의 답변을 설명하면서
안 팜에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.