Beralih ke tampilan tab TabBar secara terprogram?


159

Katakanlah saya memiliki tampilan UIButtontab dalam satu di aplikasi iPhone saya, dan saya ingin membuka tab lain di bilah tab di TabBarController. Bagaimana saya menulis kode untuk melakukan ini?

Saya berasumsi saya membongkar tampilan yang ada dan memuat tampilan tab tertentu, tetapi saya tidak yakin bagaimana menulis kode dengan tepat.


Saya memiliki masalah dengan metode di atas, kawan membantu dalam [pertanyaan] [1] [1]: stackoverflow.com/questions/19742416/...
Roman Simenok

Jawaban:


399

Coba kode ini di Swift atau Objective-C

Cepat

self.tabBarController.selectedIndex = 1

Objektif-C

[self.tabBarController setSelectedIndex:1];

8
Perhatikan bahwa, jika indeks memetakan ke tab dalam pengontrol tampilan lainnya (jika Anda memiliki lebih dari lima tab), ini tidak akan berfungsi. Dalam hal itu, gunakan -setSelectedViewController:.
Joe D'Andrea

Setelah saya melakukan ini dan berhasil mengubah tab, saya tidak lagi dapat memilih bar tab secara normal. UPDATE: ini entah bagaimana terkait dengan saya memanggil popToRootViewController tepat sebelum saya bertukar tab secara terprogram.
Adam Johns

Tetapi bagaimana Self tidak akan bekerja jika saya ingin mengganti tab. katakanlah saya klik tab 3 dan tampilkan alertView sekarang saat pengguna menekan ok, saya ingin beralih ke tab 1 lagi. Diri tidak akan benar karena bukan objek saat ini. Benar ?
Alix

Ini berfungsi dengan baik tetapi saya juga harus meneruskan data sambil mengganti tab. Saya sudah mendapat label di tab tempat saya beralih ke yang perlu diperbarui segera setelah saya beralih tab.! Adakah solusi mudah untuk ini?
Md Rais

@AdamJohns Bagaimana Anda bisa mengatasi masalah Anda. untuk membuatnya berperilaku seperti tabBar asli. itu akan muncul ke rootViewController pada klik kedua.
Waqas

20

Perhatikan bahwa tab diindeks mulai dari 0. Jadi, potongan kode berikut berfungsi

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

pergi ke tab kelima di bilah.


12

Pendapat saya adalah bahwa selectedIndexmenggunakan atau objectAtIndextidak selalu merupakan cara terbaik untuk mengganti tab. Jika Anda menyusun ulang tab, pemilihan indeks dengan kode keras mungkin mengacaukan perilaku aplikasi Anda sebelumnya.

Jika Anda memiliki referensi objek pengontrol tampilan yang ingin Anda alihkan, Anda bisa melakukan:

tabBarController.selectedViewController = myViewController

Tentu saja Anda harus memastikan, itu myViewControllerbenar - benar ada dalam daftar tabBarController.viewControllers.


Saya perlu memilih moreNavController dan itu satu-satunya cara untuk melakukannya sejauh yang saya tahu
Ossir

9

Anda cukup mengatur selectedIndexproperti pada UITabBarController ke indeks yang sesuai dan tampilan akan berubah seperti pengguna mengetuk tombol tab.


6
Dengan satu perbedaan kecil adalah bahwa metode delegasi yang dapat menginformasikan pengguna beralih tab tidak dipanggil.
Brad The App Guy

3
Pengaturan selectedIndexjuga tidak berfungsi untuk saya dengan indeks> 4, tetapi selectedViewControllertidak.
bugloaf

3

Saya mencoba apa yang disarankan oleh Disco S2, sudah dekat tapi inilah yang akhirnya berhasil untuk saya. Ini dipanggil setelah menyelesaikan tindakan di dalam tab lain.

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

2

Untuk kasus di mana Anda mungkin memindahkan tab, berikut adalah beberapa kode.

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

2

Seperti solusi Stuart Clark tetapi untuk 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
}

Gunakan seperti ini:

setTab(MyViewController.self)

Harap perhatikan bahwa tabController saya terhubung ke viewControllers di belakang navigationControllers. Tanpa navigationControllers akan terlihat seperti ini:

if let controller is T {

Tanpa perulangan, tidak ada pengontrol navigasi: func selectViewController <ViewControllerModel> (ketik: ViewControllerModel.Type) {self.selectedViewController = self.viewControllers? .First (di mana: {viewController dalam viewController adalah ViewControllerModel})}
dev_exo

1

Saya ingin dapat menentukan tab mana yang ditunjukkan oleh kelas daripada indeks karena saya pikir itu dibuat untuk solusi yang kuat yang kurang tergantung pada bagaimana Anda memasang IB. Saya tidak menemukan solusi Disco atau Joped untuk bekerja, jadi saya membuat metode ini:

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

Anda menyebutnya seperti ini:

[self setTab:[YourClass class]];

Semoga ini bermanfaat bagi seseorang


Ini bekerja dengan baik! Saya menulis ulang untuk Swift3 di jawaban lain.
Json

1

Masalah saya sedikit berbeda, saya perlu beralih dari satu childViewController di 1st tabBar ke home viewController dari 2nd tabBar. Saya cukup menggunakan solusi yang disediakan di lantai atas:

tabBarController.selectedIndex = 2

Namun ketika beralih ke beranda tabBar ke-2, kontennya tidak terlihat. Dan ketika saya debug, viewDidAppear, viewWillAppear, viewDidLoad, tidak ada satupun yang dipanggil. Solusi saya adalah menambahkan kode berikut di UITabBarController:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

0

Gunakan dalam AppDelegate.mfile:

(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

Seperti solusi Stuart Clark tetapi untuk Swift 3 dan menggunakan pengidentifikasi restorasi untuk menemukan tab yang benar:

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
}

Gunakan seperti ini ("Manusia" dan "Robot" juga harus diatur dalam storyboard untuk viewController tertentu dan ID Pemulihannya, atau gunakan ID Storyboard dan centang "gunakan storyboard ID" sebagai ID pemulihan):

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

Harap perhatikan bahwa tabController saya terhubung ke viewControllers di belakang navigationControllers. Tanpa navigationControllers akan terlihat seperti ini:

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
Biasanya lebih baik untuk menjelaskan solusi daripada hanya memposting beberapa baris kode anonim. Anda dapat membaca Bagaimana cara menulis jawaban yang baik , dan juga Menjelaskan jawaban sepenuhnya berdasarkan kode
Anh Pham
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.