Chuyển sang chế độ xem tab TabBar theo chương trình?


159

Giả sử tôi có UIButtonchế độ xem một tab trong ứng dụng iPhone của mình và tôi muốn nó mở một tab khác trong thanh tab của TabBarController. Làm thế nào tôi có thể viết mã để làm điều này?

Tôi giả sử tôi hủy tải chế độ xem hiện tại và tải chế độ xem tab cụ thể, nhưng tôi không chắc cách viết mã chính xác.


Tôi gặp vấn đề với các phương pháp ở trên, mọi người giúp tôi trong [câu hỏi] [1] [1]: stackoverflow.com/questions/19742416/
Kẻ

Câu trả lời:


399

Hãy thử mã này trong Swift hoặc Objective-C

Nhanh

self.tabBarController.selectedIndex = 1

Mục tiêu-C

[self.tabBarController setSelectedIndex:1];

8
Lưu ý rằng, nếu chỉ mục ánh xạ tới một tab trong Trình điều khiển chế độ xem khác (nếu bạn có nhiều hơn năm tab), thì điều này sẽ không hoạt động. Trong trường hợp đó, sử dụng -setSelectedViewController:.
Joe D'Andrea

Sau khi tôi làm điều này và nó thay đổi các tab thành công, tôi không còn có thể chọn thanh tab bình thường. CẬP NHẬT: điều này bằng cách nào đó liên quan đến tôi khi gọi popToRootViewControll ngay trước khi tôi đổi tab theo chương trình.
Adam Johns

Nhưng làm thế nào Self sẽ không hoạt động nếu tôi muốn chuyển đổi tab. giả sử tôi nhấp vào tab 3 và hiển thị alertView ngay khi người dùng nhấn ok, tôi muốn chuyển sang tab 1 lần nữa. Tự sẽ không đúng vì nó không phải là đối tượng hiện tại. Chính xác ?
Alix

Điều này hoạt động tốt nhưng tôi cũng phải truyền dữ liệu trong khi chuyển đổi các tab. Tôi đã có một nhãn trong tab nơi tôi chuyển sang cần được cập nhật ngay khi tôi chuyển tab.! Bất kỳ giải pháp dễ dàng cho điều này?
Md Rais

@AdamJohns Làm thế nào bạn quản lý để giải quyết vấn đề của bạn. để làm cho nó hoạt động như tabBar bản địa. nó sẽ bật lên rootViewControll trên lần nhấp thứ hai.
Waqas

20

Lưu ý rằng các tab được lập chỉ mục bắt đầu từ 0. Vì vậy đoạn mã sau hoạt động

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

đi đến tab thứ năm trong thanh.


12

Ý kiến ​​của tôi là selectedIndexhoặc sử dụng objectAtIndexkhông nhất thiết là cách tốt nhất để chuyển đổi tab. Nếu bạn sắp xếp lại các tab của mình, lựa chọn chỉ mục được mã hóa cứng có thể gây rối với hành vi ứng dụng trước đây của bạn.

Nếu bạn có tham chiếu đối tượng của trình điều khiển xem bạn muốn chuyển sang, bạn có thể làm:

tabBarController.selectedViewController = myViewController

Tất nhiên bạn phải chắc chắn, đó myViewControllerthực sự là trong danh sách tabBarController.viewControllers.


Tôi cần phải chọn thêmNavControll và đó là cách duy nhất để làm điều đó theo như tôi biết
Ossir

9

Bạn có thể chỉ cần đặt thuộc selectedIndextính trên UITabBarContoder thành chỉ mục thích hợp và chế độ xem sẽ được thay đổi giống như người dùng gõ nút tab.


6
Với một sự khác biệt nhỏ là phương thức ủy nhiệm có thể thông báo về các tab chuyển đổi người dùng không được gọi.
Brad The App Guy

3
Cài đặt selectedIndexcũng không hoạt động với tôi với chỉ số> 4, nhưng selectedViewControllerkhông.
bugloaf

3

Tôi đã thử những gì Disco S2 gợi ý, nó rất gần nhưng đây là thứ cuối cùng làm việc cho tôi. Điều này đã được gọi sau khi hoàn thành một hành động bên trong một tab khác.

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

2

Đối với trường hợp bạn có thể di chuyển các tab, đây là một số mã.

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

2

Giống như giải pháp của Stuart Clark nhưng dành cho 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
}

Sử dụng nó như thế này:

setTab(MyViewController.self)

Xin lưu ý rằng tabControll của tôi liên kết đến viewControllers đằng sau navigationControllers. Nếu không có navigationControllers thì nó sẽ như thế này:

if let controller is T {

Nếu không có vòng lặp, không có bộ điều khiển chuyển hướng: func selectViewController <ViewControllerModel> (loại: ViewControllerModel.Type) {self.selectedViewController = self.viewControllers .first (nơi: {viewController trong viewController là ViewControllerModel})?}
dev_exo

1

Tôi muốn có thể chỉ định tab nào được hiển thị theo lớp thay vì chỉ mục như tôi nghĩ nó được tạo cho một giải pháp mạnh mẽ mà ít phụ thuộc vào cách bạn kết nối IB. Tôi đã không tìm thấy các giải pháp của Disco hoặc Joped hoạt động nên tôi đã tạo ra phương pháp này:

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

bạn gọi nó như thế này:

[self setTab:[YourClass class]];

Hy vọng điều này hữu ích cho ai đó


Điều này đã làm việc tuyệt vời! Tôi đã viết lại cho Swift3 trong một câu trả lời khác.
Json

1

Vấn đề của tôi là một chút khác nhau, tôi cần phải chuyển từ một childViewControll trong tab 1Bar sang home viewContaptor của 2nd tabBar. Tôi chỉ đơn giản là sử dụng giải pháp được cung cấp ở tầng trên:

tabBarController.selectedIndex = 2

Tuy nhiên, khi nó chuyển sang trang chủ của tab thứ 2, nội dung là vô hình. Và khi tôi gỡ lỗi, viewDidAppear, viewWillAppear, viewDidLoad, không ai trong số chúng được gọi. Giải pháp của tôi là thêm đoạn mã sau vào UITabBarControll:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

0

Sử dụng trong AppDelegate.mtập tin:

(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

Giống như giải pháp của Stuart Clark nhưng dành cho Swift 3 và sử dụng định danh phục hồi để tìm tab chính xác:

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
}

Sử dụng nó như thế này ("Con người" và "Rô bốt" cũng phải được đặt trong bảng phân cảnh cho chế độ xem cụ thể và đó là ID khôi phục hoặc sử dụng ID Storyboard và kiểm tra "sử dụng ID bảng phân cảnh" làm ID phục hồi):

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

Xin lưu ý rằng tabControll của tôi liên kết đến viewControllers đằng sau navigationControllers. Nếu không có navigationControllers thì nó sẽ như thế này:

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
Thông thường tốt hơn là giải thích một giải pháp thay vì chỉ đăng một số hàng mã ẩn danh. Bạn có thể đọc Làm thế nào để tôi viết một câu trả lời hay và cũng Giải thích các câu trả lời hoàn toàn dựa trên mã
Anh Phạm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.