Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不显示选项卡栏的情况下执行到其他导航控制器的切换_Ios_Swift_Uinavigationcontroller_Uitabbarcontroller_Xcode7 - Fatal编程技术网

Ios 在不显示选项卡栏的情况下执行到其他导航控制器的切换

Ios 在不显示选项卡栏的情况下执行到其他导航控制器的切换,ios,swift,uinavigationcontroller,uitabbarcontroller,xcode7,Ios,Swift,Uinavigationcontroller,Uitabbarcontroller,Xcode7,我有一个根选项卡主机控制器,有两个导航控制器选项卡同级:(1)附近的站点和(2)保存的站点。每个控制器分别有一个视图控制器 我想执行从一个同级视图控制器到另一个导航控制器的切换,其中嵌入了停止计划视图控制器,并满足以下要求: 根选项卡栏不应显示在此视图控制器的底部 在执行segue之前,我需要将Stop对象传递到此视图控制器 故事板: 目前,我正在以这种方式执行一个segue,尽管选项卡栏在不应该保留的时候仍保留在Stop Schedule View Controller上 func show

我有一个根
选项卡主机控制器
,有两个
导航控制器
选项卡同级:(1)附近的站点和(2)保存的站点。每个控制器分别有一个
视图控制器

我想执行从一个同级
视图控制器
到另一个
导航控制器
的切换,其中嵌入了停止计划视图控制器,并满足以下要求:

  • 选项卡栏
    不应显示在此
    视图控制器的底部
  • 在执行segue之前,我需要将
    Stop
    对象传递到此视图控制器
  • 故事板:

    目前,我正在以这种方式执行一个segue,尽管
    选项卡栏
    在不应该保留的时候仍保留在Stop Schedule View Controller上

    func showStopSchedule(stop: Stop) {
        let stopScheduleController = self.storyboard?.instantiateViewControllerWithIdentifier("StopScheduleViewController") as! StopScheduleViewController
    
        stopScheduleController.stop = stop    // pass data object
    
        self.navigationController?.pushViewController(stopScheduleController, animated: true)
    }
    

    您没有使用刚刚在故事板中定义的序列。相反,您当前正在手动重新加载
    StopScheduleViewController
    ,而您应该只执行已定义的
    segue

    向要以编程方式调用的每个情节提要序列添加标识符

    然后以这种方式加载它们:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        performSegueWithIdentifier("showStopSchedule", sender: self)
    }
    

    您没有使用刚刚在故事板中定义的序列。相反,您当前正在手动重新加载
    StopScheduleViewController
    ,而您应该只执行已定义的
    segue

    向要以编程方式调用的每个情节提要序列添加标识符

    然后以这种方式加载它们:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        performSegueWithIdentifier("showStopSchedule", sender: self)
    }
    

    当显示“停止计划”视图控制器时,您可以简单地设置选项卡栏的
    隐藏属性,并在该视图控制器消失之前取消隐藏选项卡栏

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.hidden=true
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        self.tabBarController?.tabBar.hidden=false
    }
    
    更新:要设置过渡动画,可以使用以下命令:

    class StopViewController: UIViewController {
    
        var barFrame:CGRect?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    
        override func viewWillAppear(animated: Bool) {
    
            super.viewWillAppear(animated)
            // self.tabBarController?.tabBar.hidden=true
            if  let tabBar=self.tabBarController?.tabBar {
               self.barFrame=tabBar.frame
    
               UIView.animateWithDuration(0.3, animations: { () -> Void in
                   let newBarFrame=CGRectMake(self.barFrame!.origin.x, self.view.frame.size.height, self.barFrame!.size.width, self.barFrame!.size.height)
                   tabBar.frame=newBarFrame
                }, completion: { (Bool) -> Void in
                    tabBar.hidden=true
                })
    
            }
        }
    
        override func viewWillDisappear(animated: Bool) {
            super.viewWillDisappear(animated)
            self.tabBarController?.tabBar.hidden=false;
            if self.barFrame != nil {
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    let newBarFrame=CGRectMake(self.barFrame!.origin.x, self.view.frame.size.height-self.barFrame!.size.height, self.view.frame.size.width, self.barFrame!.size.height)
                    self.tabBarController?.tabBar.frame=newBarFrame
                })
    
            }
        }
    }
    

    当显示“停止计划”视图控制器时,您可以简单地设置选项卡栏的
    隐藏属性,并在该视图控制器消失之前取消隐藏选项卡栏

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.hidden=true
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        self.tabBarController?.tabBar.hidden=false
    }
    
    更新:要设置过渡动画,可以使用以下命令:

    class StopViewController: UIViewController {
    
        var barFrame:CGRect?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    
        override func viewWillAppear(animated: Bool) {
    
            super.viewWillAppear(animated)
            // self.tabBarController?.tabBar.hidden=true
            if  let tabBar=self.tabBarController?.tabBar {
               self.barFrame=tabBar.frame
    
               UIView.animateWithDuration(0.3, animations: { () -> Void in
                   let newBarFrame=CGRectMake(self.barFrame!.origin.x, self.view.frame.size.height, self.barFrame!.size.width, self.barFrame!.size.height)
                   tabBar.frame=newBarFrame
                }, completion: { (Bool) -> Void in
                    tabBar.hidden=true
                })
    
            }
        }
    
        override func viewWillDisappear(animated: Bool) {
            super.viewWillDisappear(animated)
            self.tabBarController?.tabBar.hidden=false;
            if self.barFrame != nil {
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    let newBarFrame=CGRectMake(self.barFrame!.origin.x, self.view.frame.size.height-self.barFrame!.size.height, self.view.frame.size.width, self.barFrame!.size.height)
                    self.tabBarController?.tabBar.frame=newBarFrame
                })
    
            }
        }
    }
    

    如果只想隐藏navigationController,下面的代码可以工作

      self.navigationController?.navigationBar.hidden = true
    

    如果您只想隐藏navigationController,下面的代码可以工作

      self.navigationController?.navigationBar.hidden = true
    


    虽然这是正确的,但它并没有回答如何隐藏选项卡栏的问题。这可能是一个评论,确实是这样。加载序列会隐藏标签栏。嗯,是的。我没有注意到他们在最终视图控制器前面插入的附加导航控制器。使用这种方法,这可能是不必要的。如何将
    停止
    对象传递给视图控制器?使用
    -(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
    ,请参见,虽然这是正确的,但它没有回答如何隐藏选项卡栏的问题。这可能是一个评论,确实是这样。加载序列会隐藏标签栏。嗯,是的。我没有注意到他们在最终视图控制器前面插入的附加导航控制器。对于这种方法,这可能是不必要的。如何将
    Stop
    对象传递给视图控制器?使用
    -(void)prepareforsgue:(UIStoryboardSegue*)segue sender:(id)sender
    ,查看为什么在停车计划控制器前面有附加导航控制器?我将其包括在内是为了使选项卡栏不包含在视图控制器中。好的,请将其删除,然后在需要时使用我答案中的代码隐藏选项卡栏。这也将使用户导航更简单,因为他们可以简单地返回到开始的位置。SwiftArchitect也是正确的;你没有在情节提要中使用segue。您可以使用
    performsguewithidentifier
    prepareforsgue
    通过站点为什么您的站点计划控制器前面有额外的导航控制器?我包括了它,这样选项卡栏就不会包括在视图控制器中。好的,请删除它,然后在需要时使用我答案中的代码隐藏选项卡栏。这也将使用户导航更简单,因为他们可以简单地返回到开始的位置。SwiftArchitect也是正确的;你没有在情节提要中使用segue。您可以使用
    performsguewithidentifier
    prepareforsgue
    来通过停止。这确实隐藏了选项卡栏,但当视图控制器出现时,选项卡栏上会出现明显的淡入淡出动画。这是一种折衷。就我个人而言,我更喜欢它,而不是使用第二个导航控制器进行模式转换,并且不会丢失导航堆栈。请参阅我的更新答案以获得动画替代方案。谢谢Paulw11,我将尝试您的解决方案和SwiftArchitect的解决方案,以查看哪一种效果最好。@Paulw11:太好了!我更新了代码,以防止在设备旋转时选项卡栏短暂出现,并确保在返回第一个视图之前设备旋转时能够正常工作。这确实会隐藏选项卡栏,但当视图控制器出现时,选项卡栏上会出现明显的淡入淡出动画。这是一种折衷。就我个人而言,我更喜欢它,而不是使用第二个导航控制器进行模式转换,并且不会丢失导航堆栈。请参阅我的更新答案以获得动画替代方案。谢谢Paulw11,我将尝试您的解决方案和SwiftArchitect的解决方案,以查看哪一种效果最好。@Paulw11:太好了!我更新了代码,以防止旋转设备时选项卡栏短暂出现,并确保在返回第一个视图之前旋转设备时,选项卡栏的行为正常