我一直在遇到一些我認爲可能很容易的麻煩。我在我的根視圖控制器中有一個表,當選中一行時,我推入一個新視圖,然後從那裏轉到另一個選項卡。當選擇標籤時彈出到根視圖
我的問題是我如何確保一旦用戶點擊第一個選項卡導航控制器將彈出到根?
我一直在遇到一些我認爲可能很容易的麻煩。我在我的根視圖控制器中有一個表,當選中一行時,我推入一個新視圖,然後從那裏轉到另一個選項卡。當選擇標籤時彈出到根視圖
我的問題是我如何確保一旦用戶點擊第一個選項卡導航控制器將彈出到根?
[self.navigationController popToRootViewControllerAnimated:NO];
你正在嘗試做聽起來有點奇怪。您是否閱讀了關於組合UINavigationControllers和UITabBarControllers的人機界面指南?
但是,你需要做的是通過設置委託你的UITabBarController和實施tabBarController檢測標籤的選擇:didSelectViewController:委託方法。在這種方法中,您需要使用UINavigationController的popToRootViewControllerAnimated:方法回彈到根視圖控制器。而上的TabBar所選的每個選項卡
如果您查看Apple的Phone.app,收藏夾和最近的選項卡的行爲與OP所需的行爲相同。 –
當您選擇表格行時,電話應用程序不會切換選項卡 - 這是我查詢的行爲,而不是在用戶點擊不同選項卡時彈出到根目錄。 –
啊,是的,OP的問題並不完全是OP的意思,「從那裏我去另一個標籤」。用戶是否選擇了另一個標籤或應用程序是否自動切換。 –
以下委託調用。
-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
將下面的代碼放在這個委託方法中。
if ([viewController isKindOfClass:[UINavigationController class]])
{
[(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
}
它在我的應用程序上正常工作。
非常感謝它爲我工作。 –
是的,它真的在我的應用程序中工作,謝謝 – Pradeep
對我來說真的很有幫助,根據我的要求,在我的應用程序中正常工作。 – ravinder521986
對於斯威夫特的戀人:
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);
}
}
}
編輯:斯威夫特3更新,感謝@Justin Oroz指出了這一點。
作爲OP的問題問ROOT控制器,它應該是(在Swift 3語法中) 'vc.popToRootViewController(animated:false)' –
首先,你應該創建的UITabBarController的子類,並添加觀察報:
- (void)viewDidLoad {
[super viewDidLoad];
[self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}
當選擇TabBar,所以我們將在方法處理:
-(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];
}
}
}
}
的UTabController提出不同的UX你讓一個用戶「彈出到根」。切換回選項卡時,它會保留之前的完整UINav堆棧。如果他們第二次點擊酒吧項目(點擊選定的標籤),只有這樣它纔會彈出到根目錄。這全是自動的。有些應用程序(如instagram)允許第三次點擊滾動到頂部。
我建議用缺省值作爲堅持就是用戶將被期待。
的下面曾我在迅速3工作。這代碼:
1>子類的UITabBarController和實現兩個以下方法與一種IVAR:
class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }
2>設置的TabBar代表在viewDidLoad中
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給你所選擇的選項卡
在tabBarController_shouldSelect_viewController方法中,您可以通過一些簡單的計算來設置所需的視圖控制器。
如果你沒有得到與上述兩種方法上面的代碼舞臺上,你會知道如何都一起工作
在雨燕3.1
添加UITabBarControllerDelegate到您的TabBar類:
類YourClass :的UITabBarController,UITabBarControllerDelegate {
後:
覆蓋FUNC的TabBar(的TabBar:UITabBar,didSelectItem項目: UITabBarItem){
let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController yourView .popToRootViewControllerAnimated(false)
}
改變動畫爲NO實際上幫助了我。當我將動畫設置爲YES時,我的選項卡欄或導航控制器中的任何其他按鈕都不起作用。 – Glogo