2011-10-04 17 views
15

Kolay olabileceğini düşündüğüm bir şeyle ilgili bir sorun yaşıyorum. Kök görünüm denetleyicimde bir satır var, bir satır seçildiğinde yeni bir görüntüyü itip başka bir sekmeye gidiyorum.Sekme seçildiğinde kök görünümüne pop

Soruma göre, kullanıcı ilk sekmeye dokunduğunda, gezinme denetleyicisinin köklenmesini sağlayacağından nasıl emin olabilirim?

cevap

3
[self.navigationController popToRootViewControllerAnimated:NO]; 
+0

YOK aslında bana yardımcı animasyonlu Değiştirme. Animasyon ayarını EVET olarak ayarladığımda, sekme çubuğum veya gezinme denetleyicisindeki diğer düğmeler çalışmıyordu. – Glogo

3

Ne yapmaya çalışıyorsunuz biraz tuhaf geliyor. UINavigationControllers ve UITabBarControllers'ı birleştirme konusunda İnsan Arayüzü Kılavuzunu okudunuz mu?

Ancak, yapmanız gereken, UITabBarController'ınız için bir temsilci belirleyerek ve tabBarController: didSelectViewController: temsilci yöntemini uygulayarak sekmenin seçimini algılamaktır. Bu yöntemde, UINavigationController'ın popToRootViewControllerAnimated: yöntemini kullanarak kök görünüm denetleyicisine geri dönmeniz gerekir.

+0

Apple'ın Phone.app'ına bir göz atıyorsanız, sık kullanılanlar sekmesinin davranışı OP'nin istediğiyle aynıdır. –

+0

Telefon uygulaması, bir tablo satırı seçtiğinizde sekmeleri değiştirmez - bu, sorgulama yaptığım davranıştı, kullanıcı farklı bir sekmeye dokunduğunda köklenmez. –

+0

Ah, evet OP'nin sorusu, OP'in "oradan başka bir sekmeye gittiğimde" ne anlama geldiği değil. Kullanıcı başka bir sekme seçerse veya uygulama otomatik olarak değişir. –

25

Aşağıdaki sekmeler, her sekme tabbarda seçildiğinde çağrılır. Bu temsilci yönteminin içine kod aşağıdaki

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

koyun. Uygulamamdaki iyi çalıştığı

. Swift severler için

+0

Çok fazla benim için çalıştı. –

+0

Evet gerçekten uygulamada çalışıyorum – Pradeep

+0

Gerçekten benim için çok yararlı, benim uygulamada iyi çalışıyor. – ravinder521986

8

:

import UIKit 

class YourTabBarControllerHere: UITabBarController, 
UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate = self; 
    } 

    func tabBarController(tabBarController: UITabBarController, 
     didSelectViewController viewController: UIViewController) { 
      if let vc = viewController as? UINavigationController { 
       vc.popViewControllerAnimated(animated: false); 
      } 
    } 
} 

Düzenleme: Swift 3 güncellemesi Buna dikkat çektiğin için @Justin Oroz için teşekkürler.

+0

OP'nin sorusu ROOT denetleyicisi için sorulduğunda, (Swift 3 sözdiziminde) 'vc.popToRootViewController (animasyonlu: false)' olmalıdır –

0

İlk olarak, UITabBarController alt sınıfı oluşturmak ve eklemek gerekir Gözlemci: tabbar seçildiğinde

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; 
} 

Biz yöntemde işleyecek:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
    if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){ 
     UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing. 
     // The change dictionary will contain the previous tabBarItem for the "old" key. 
     UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey]; 
     NSUInteger was = [bar.items indexOfObject:wasItem]; 
     // The same is true for the new tabBarItem but it will be under the "new" key. 
     UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey]; 
     NSUInteger is = [bar.items indexOfObject:isItem]; 
     if (is == was) { 
      UIViewController *vc = self.viewControllers[is]; 
      if ([vc isKindOfClass:[UINavigationController class]]) { 
       [(UINavigationController *)vc popToRootViewControllerAnimated:YES]; 
      } 
     } 
    } 
} 
0

UTabController bir bildirdiğiniz için farklı bir UX anlaşılacağı kullanıcı "pop to root". Bir sekmeye geri dönerken, tam UINav yığınını daha önce korur. Çubuk öğesine ikinci kez dokunursanız (seçilen sekmeye dokunarak), ancak o zaman root'a dönüşür. Hepsi otomatik. İnstagram gibi bazı uygulamalar, üçüncü bir dokunmanın en üste kaydırılmasına izin verir.

Varsayılanları, kullanıcıların beklediği gibi yapmasını öneriyorum.

1> alt sınıf UITabBarController ve bir Ivar ile yönteminin altında iki uygulamak:

0

aşağıda hızlı 3'te benim için .Bu kod çalışmış
class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }

2> viewDidLoad

yılında tabbar temsilci ayarlamak
override func viewDidLoad() {  
    super.viewDidLoad() 
    self.delegate = self // you must do it} 

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 

    self.previousSelectedTabIndex = tabBarController.selectedIndex 
}  
func tabBarController(_ tabBarController: UITabBarController, 
           shouldSelect viewController: UIViewController) -> Bool {  

    if self.previousSelectedTabIndex == tabBarController.selectedIndex { 
     let nav = viewController as! UINavigationController // mine in nav_VC 
     for vc in nav.childViewControllers { 
      if vc is YUOR_DESIRED_VIEW_CONTROLLER { 
      nav.popToViewController(vc, animated: true) 
      return false// IT WONT LET YOU GO TO delegate METHOD 
      } 
     } 
    } 
return true 
}  

tabBarController.selectedIndex, seçilen sekmeyi vermek

tabBarController_shouldSelect_viewController yönteminde istediğiniz görünüm kontrol cihazını bazı kolay hesaplamalarla ayarlayabilirsiniz.
Yukarıdaki yöntemle hem Yukarıdaki kod oyun almıyorsanız ve her iki

Swift 3.1 araya

2

çalışma nasıl geliyorsa sizin TabBar Class UITabBarControllerDelegate ekleyin:

sınıf YourClass : UITabBarController, UITabBarControllerDelegate {

sonra:

kılma fonk TabBar (TabBar: UITabBar, didSelectItem madde: UITabBarItem) {

let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController 
yourView .popToRootViewControllerAnimated(false) 

}