Programlı olarak bir TabBar sekmesi görünümüne geçiliyor mu?


159

Diyelim ki UIButtoniPhone uygulamamda tek bir sekme görünümü var ve ekranın sekme çubuğunda farklı bir sekme açmasını istiyorum TabBarController. Bunu yapmak için kodu nasıl yazarım?

Mevcut görünümü kaldırdığımı ve belirli bir sekme görünümünü yüklediğimi varsayıyorum, ancak kodu tam olarak nasıl yazacağımdan emin değilim.


Yukarıdaki yöntemlerle ilgili sorun yaşıyorum, çocuklar [soru] [1] [1] 'de yardım ediyor: stackoverflow.com/questions/19742416/…
Roman Simenok

Yanıtlar:


399

Swift veya Objective-C'de bu kodu deneyin

hızlı

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];

8
Dizin, Daha fazla görünüm denetleyicisindeki bir sekme ile eşleşiyorsa (beşten fazla sekmeniz olması gerekiyorsa), bunun işe yaramayacağını unutmayın. Bu durumda, kullanın -setSelectedViewController:.
Joe D'Andrea

Bunu yaptıktan ve sekmeleri başarıyla değiştirdikten sonra artık sekme çubuğunu normal olarak seçemiyorum. GÜNCELLEME: Bu bir şekilde sekmeleri programlı olarak takas etmeden önce popToRootViewController'ı çağırmakla ilgiliydi.
Adam Johns

Ama sekmeyi değiştirmek istersem Self nasıl çalışmaz. diyelim ki sekme 3'ü tıklıyorum ve alert'ü şimdi göster Kendisi şu anki nesne olarak doğru olmayacak. Doğru mu?
Alix

Bu iyi çalışıyor ama aynı zamanda sekmeleri değiştirirken veri geçmek zorunda. Sekmede, sekme değiştirilir değiştirilmez güncellenmesi gereken bir etiket var.! Bunun kolay bir çözümü var mı?
Md Rais

@AdamJohns Sorununuzu nasıl çözdünüz? yerel tabBar gibi davranmasını sağlamak için. ikinci tıklamada rootViewController'a gelmelidir.
Waqas

20

Sekmelerin 0'dan başlayarak dizine eklendiğini unutmayın. Bu nedenle aşağıdaki kod snippet'i çalışır

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

çubuktaki beşinci sekmeye gider.


12

Benim düşüncem, sekmeyi değiştirmenin selectedIndexveya kullanmanın objectAtIndexilla ki en iyi yolu olmadığıdır. Sekmelerinizi yeniden sıralarsanız, sabit kodlanmış bir dizin seçimi eski uygulama davranışınıza zarar verebilir.

Geçiş yapmak istediğiniz görünüm denetleyicisinin nesne referansına sahipseniz, şunları yapabilirsiniz:

tabBarController.selectedViewController = myViewController

Tabii ki, bu myViewControllergerçekten listede olduğundan emin olmalısınız tabBarController.viewControllers.


NAVController'ı seçmem gerekiyordu ve bunu bildiğim kadarıyla yapmanın tek yolu bu
Ossir

9

selectedIndexUITabBarController öğesindeki özelliği uygun dizine ayarlamanız yeterlidir ve kullanıcı sekme düğmesine dokunduğunda görünüm değişir.


6
Tek küçük fark, kullanıcı değiştirme sekmeleri hakkında bilgi verebilen temsilci yönteminin çağrılmamasıdır.
Brad App Guy

3
Ayar selectedIndexayrıca dizinler> 4 ile benim için selectedViewControllerçalışmıyor , ancak çalışıyor .
bugloaf

3

Disco S2'nin önerisini denedim, yakındı ama bu benim için çalışmaya başladı. Bu, başka bir sekmedeki bir işlemi tamamladıktan sonra çağrıldı.

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

2

Sekmeleri taşıyabileceğiniz durumlar için işte bir kod.

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

2

Stuart Clark'ın çözümü gibi ama Swift 3 için:

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
}

Şöyle kullanın:

setTab(MyViewController.self)

TabController'ımın navigationControllers'ın arkasındaki viewControllers'a bağlandığını lütfen unutmayın. NavigationControllers olmadan şöyle görünecektir:

if let controller is T {

Döngü olmadan, gezinme denetleyicileri yok: func selectViewController <ViewControllerModel> (tür: ViewControllerModel.Type) {self.selectedViewController = self.viewControllers? .First (burada: {viewController içindeki viewController ViewControllerModel} 'dir)}
dev_exo

1

IB'yi nasıl bağladığınıza daha az bağımlı olan sağlam bir çözüm için düşündüğüm gibi, hangi sekmenin dizin yerine sınıf tarafından gösterildiğini belirtmek istedim. Disko veya Joped'in çözümlerini bulamadım bu yüzden bu yöntemi yarattım:

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

buna şöyle diyorsun:

[self setTab:[YourClass class]];

Umarım bu birisine yardımcı olur


Bu harika çalıştı! Swift3 için başka bir cevapta yeniden yazdım.
Json,

1

Benim sorunum biraz farklı, ben 1 tabBar bir childViewController 2 tabBar ev viewController geçmek gerekir. Üst kattaki çözümü kullanıyorum:

tabBarController.selectedIndex = 2

Ancak 2. tabBar'ın ana sayfasına geçildiğinde içerik görünmez olur. Ve hata ayıkladığımda, viewDidAppear, viewWillAppear, viewDidLoad, hiçbiri çağrılmaz. Çözümlerim UITabBarController'da aşağıdaki kodu eklemektir:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}

0

AppDelegate.mDosyada kullan :

(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'ın çözümü gibi ama Swift 3 için ve doğru sekmeyi bulmak için restorasyon tanımlayıcısını kullanma:

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
}

Bu şekilde kullanın ("İnsanlar" ve "Robotlar", belirli viewController ve bunun Restorasyon Kimliği için film şeridinde de ayarlanmalıdır veya Film şeridi kimliğini kullanın ve geri yükleme kimliği olarak "film şeridi kimliğini kullan" seçeneğini işaretleyin):

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

TabController'ımın navigationControllers'ın arkasındaki viewControllers'a bağlandığını lütfen unutmayın. NavigationControllers olmadan şöyle görünecektir:

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
Genellikle, bazı anonim kod satırlarını göndermek yerine bir çözümü açıklamak daha iyidir. Okuyabiliyorsun İyi bir cevap yazmak nasıl da ve tamamen kod tabanlı cevapları açıklanması
Anh Pham
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.