Swift:如果它是第一个选项卡,tabcontroller中的表只能正确定位?

我附上说明我遇到的问题的示例代码。 出于某种原因,tableview控制器必须是第一个选项卡才能识别导航栏。 这个问题是我昨天提出的这个问题的延伸

这里是实际的示例项目iosTableTabTest的链接

AppDelegate中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { window = UIWindow(frame: UIScreen.mainScreen().bounds) let containerViewController:ContainerViewController = ContainerViewController() window!.rootViewController = containerViewController window!.makeKeyAndVisible() return true } 

ContainerViewController.swift:

 class ContainerViewController: UIViewController, LoginDelegate { var mainNavigationController: UINavigationController! var myTabBarController: UITabBarController! var loginViewController: LoginViewController! override func viewDidLoad() { super.viewDidLoad() var mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) myTabBarController = mainStoryboard.instantiateViewControllerWithIdentifier("myTabBarController") as? UITabBarController loginViewController = mainStoryboard.instantiateViewControllerWithIdentifier("loginViewController") as? LoginViewController loginViewController.delegate = self mainNavigationController = UINavigationController(rootViewController: loginViewController) view.addSubview(mainNavigationController.view) addChildViewController(mainNavigationController) mainNavigationController.didMoveToParentViewController(self) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func loginPressed() { self.mainNavigationController.pushViewController(self.myTabBarController, animated: false) } 

}

LoginViewController.swift:

 @objc protocol LoginDelegate{ func loginPressed() } class LoginViewController: UIViewController { @IBOutlet var loginBtn: UIButton! var delegate: LoginDelegate? override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func loginPressed(sender: AnyObject) { delegate?.loginPressed() } } 

FirstTabViewController.swift:

 class FirstTabViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.navigationController?.topViewController.navigationItem.setHidesBackButton(true, animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

SecondTabViewController.swift:

 class SecondTabViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

我读了你的代码,并运行你的项目,我相信问题在于你将UITabBarControllerembedded到UINavigationController中。 你想要做的是将每个UIViewController(或UITableViewController)embedded到它自己的UINavigationController中,然后将这些导航控制器设置为UITabBarController的视图控制器(即可以在故事板上进行设置)。

这就是为什么在第二个选项卡(隐藏在导航栏下面的第一行)上的tableviewcontroller的内容插入问题。 embedded了UITabBarController的UINavigationController不会通过UITabBarController向其视图控制器传递适当的插入符号。

我对你的项目做了一些改变: TableTest


Main.storyboard

我将每个UITabBarController的视图控制器embedded到它自己的UINavigationController中


ContainerViewController

我将loginViewController和myTabBarController的视图添加为容器VC视图的子视图,然后将每个控制器添加为容器VC的子控制器。 如果您有导航栏,仍然可以将loginViewControllerembedded到UINavigationController中,但为了简单起见,我已将其删除。

 class ContainerViewController: UIViewController, LoginDelegate { //var mainNavigationController: UINavigationController! var myTabBarController: UITabBarController! var loginViewController: LoginViewController! override func viewDidLoad() { super.viewDidLoad() var mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) myTabBarController = mainStoryboard.instantiateViewControllerWithIdentifier("myTabBarController") as? UITabBarController loginViewController = mainStoryboard.instantiateViewControllerWithIdentifier("loginViewController") as? LoginViewController loginViewController.delegate = self //mainNavigationController = UINavigationController(rootViewController: loginViewController) //view.addSubview(mainNavigationController.view) //addChildViewController(mainNavigationController) //mainNavigationController.didMoveToParentViewController(self) view.addSubview(myTabBarController.view) view.addSubview(loginViewController.view) self.addChildViewController(myTabBarController) self.addChildViewController(loginViewController) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func loginPressed() { //self.mainNavigationController.pushViewController(self.myTabBarController, animated: false) loginViewController.view.removeFromSuperview() loginViewController.removeFromParentViewController() } } 

FirstTabViewController

由于此视图控制器现在embedded在故事板中的自己的UINavigationController中,因此可以像访问self.navigationItem一样访问其navigationItem

 class FirstTabViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //self.navigationController?.topViewController.navigationItem.setHidesBackButton(true, animated: true) self.navigationItem.setHidesBackButton(true, animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }