【问题标题】:navigation controller custom search bar not disappearing?导航控制器自定义搜索栏没有消失?
【发布时间】:2017-04-28 03:14:47
【问题描述】:

我创建了一个自定义搜索栏并将其嵌入导航栏中,它会出现,但在我推送另一个视图控制器后,搜索栏不会被推送的视图控制器的标题替换。搜索栏在所有视图中保持不变,而不是被标题替换。完美的例子是 Instagram 搜索选项卡,您搜索一个人并单击单元格,他们的个人资料被推送,搜索栏被替换为自定义标题、后退按钮等。

第一个 VC

 self.customSearchBar.tag = 4
 self.navigationController?.view.addSubview(customSearchBar)

第二个VC

if let nav: UINavigationController = self.navigationController {
   if let searchBar = nav.view.viewWithTag(4) {
        searchBar.removeFromSuperview()
   }
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您不应将搜索栏放在导航控制器视图中,因为此视图在所有推送的视图控制器上都是同一个实例。

    将搜索栏添加到依赖的视图控制器 ui。

    【讨论】:

    • 那么我如何区分特定视图控制器和所有实例中的navigationController
    • 如果您想将视图添加到导航栏,请将它们作为子视图添加到导航栏并在转换之前将其删除,但要尽量避免这种模式......搜索栏不应该在导航中栏,但在视图控制器上。如果您想到按钮(将 bar 按钮项设置为视图控制器的导航项,这些会自动处理)
    【解决方案2】:

    要在导航栏上添加搜索栏,就是这样。

    self.navigationController?.navigationBar.addSubview(customSearchBar)
    

    当你将它推送到其他 viewController 时将其删除。在第二个VC 中编写以下代码,该代码被推入它的viewDidLoad() 函数中。另外,将customSearchBar的标签设置为任意数字(TAG

    if let nav: UINavigationController = self.navigationController {
       let bar: UINavigationBar = nav.navigationBar
       if let searchBar = bar.viewWithTag(TAG) {
            searchBar.removeFromSuperview()
       }
    }
    

    在问题中,customSearchBar 被添加到self.navigationController.view。要删除它,您可以执行以下操作:

    if let nav: UINavigationController = self.navigationController {
       if let searchBar = nav.view.viewWithTag(TAG) {
            searchBar.removeFromSuperview()
       }
    }
    

    编辑:

    添加和删除 UIViewController 的视图作为其他 UIViewController 的子视图

    // for adding
    
    let viewController: ViewController = ViewController()
    self.addChildViewController(viewController)
    self.view.addSubview(viewController.view)
    
    viewController.view.bounds = self.view.bounds // better to use autolayout here
    
    viewController.didMove(toParentViewController: self)
    
    // for removing
    
    if let vc = self.childViewControllers.last {
        vc.willMove(toParentViewController: nil)
        vc.view.removeFromSuperview()
        vc.removeFromParentViewController()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多