UISearchController的UISearchBar的光标显示首次使用,而不是后续

时间:2015-11-09 20:40:16

标签: ios swift uiviewcontroller uisearchbar uisearchcontroller

首次应用程序的这部分加载搜索控制器的搜索栏的光标显示,视需要。

Search with Cursor

(问题)当搜索被解除然后(稍后)重新编码时,无光标

Search No Cursor

这是可重复的,只需加载/解除,即没有任何东西显然可以/应该改变事物的色调,导致光标成为背景的颜色(通常是缺少光标的答案,来自SO Q& As我已经看过这个话题了。)那就是说,没有别的东西不起作用,只是光标消失了。

一些(可能)复杂因素:

  • 这个加载/卸载UISearchController的ViewController(并将UISearchBar嵌入到UINavigationController的标题中)是我的自定义容器VC中的内容VC。层次结构是:(1)UIWindow(2)UINavigationController(3)ContainerVC(4)ContainedVC [parent是ContainerVC,这个VC正在进行UISearchController加载/卸载]。
  • 有各种委托回调(UISearchController,UISearchBar)试图自定义行为(例如隐藏取消按钮,停止之间的关闭),希望这些行为不会影响事情,但仅供参考。
  • “卸载”(停止/拆除)涉及各种努力以使其消失,从标题视图中删除搜索栏,设置搜索控制器active = false等。 (因为它发生在此之后,它感觉可能是相关的,所以我尝试了各种排列以防万一有什么帮助。没有这样的运气。)

我已经做过各种尝试让孩子VC创建自己的SearchController,和/或在根VC上使用它,依此类推。各种排列似乎都有效,但同样存在缺陷。 (因此,我觉得我在寻找问题/解决方案来源的错误位置。)

我不能排除游标颜色已经改变,我不完全理解它是如何设置/继承的,特别是考虑到我拥有的VC堆栈,以及如何在调试器中测试它。我认为这就像我设置全局色调一样简单。

注意:此应用使用直接设置的情节提要,并且未使用外观代理。那说它有:

    // Default tint for application...
    UIApplication.sharedApplication().delegate?.window??.tintColor = mainBrandColor
    UIToolbar.appearance().tintColor = mainBrandColor

...我尝试过UISearchBar的各种排列,UINavigationBar色调通过外观代理w /相同的行为(首先工作,后来没那么多。)在不同的时间,(即工作时和不)它显示相同的颜色:

(lldb) po searchController.searchBar.tintColor

注意:单独使用UISearchController(当调用VC不是容器的子节点,而是推送VC时)不会显示此问题。光标仍然是正确的颜色。

环境:这是XCode 7.1上Swift中的iOS9.x应用程序。

这是一些代码,其中homeVC是父/容器VC:

    if nil == homeVC.searchController {
        homeVC.searchController = UISearchController(searchResultsController: nil)
        homeVC.searchController!.searchResultsUpdater = self
        homeVC.searchController!.delegate = self
        homeVC.searchController!.searchBar.delegate = self
        homeVC.searchController!.searchBar.showsCancelButton = false
        homeVC.searchController!.searchBar.returnKeyType = .Done
        homeVC.searchController!.searchBar.placeholder = "Add Item"
        homeVC.searchController!.searchBar.searchBarStyle = UISearchBarStyle.Minimal
        homeVC.searchController!.dimsBackgroundDuringPresentation = false
        homeVC.searchController!.hidesNavigationBarDuringPresentation = false
    }

    homeVC.navigationItem.titleView              = homeVC.searchController!.searchBar

我尝试过使用和不使用延迟加载,以及破坏/重新创建而不是。

任何关于在哪里寻找/如何排查问题的指示/想法都将不胜感激。

6 个答案:

答案 0 :(得分:4)

你在做什么 self.searchController.searchBar.showsCancelButton = NO;

我有完全相同的问题,事实证明这件事情有点相关。尝试将其注释掉,看看光标是否已经回来了。

答案 1 :(得分:3)

我遇到了同样的问题。对我有用的诀窍是当它成为第一个响应者时设置UISearchBar的tintColor

import math
rounded_up = math.ceil(x / 10) * 10
result = rounded_up - x

答案 2 :(得分:2)

我对同样的问题感到很头疼。 user1491604(第一个答案)是正确的,问题的原因是:

searchController.searchBar.showsCancelButton = false //Swift 3

评论它完全解决了问题但后来我遇到了如果 DIDN' T 想要显示取消按钮,该怎么办:

enter image description here

如果您根本不想显示取消按钮,则用户1491604的回答将无法正常工作。我按照Vitya Shurapov的回答(在这种情况下工作)来实现我自己的SearchController:

https://stackoverflow.com/questions/29976503/uisearchcontroller-searchbar-showscancelbutton-not-being-respected/42030000#42030000

class CustomSearchBar: UISearchBar {

    override func setShowsCancelButton(_ showsCancelButton: Bool, animated: Bool) {
        super.setShowsCancelButton(false, animated: false)
    }
}


class CustomSearchController: UISearchController {

    lazy var _searchBar: CustomSearchBar = {
        [unowned self] in
        let customSearchBar = CustomSearchBar(frame: CGRect.zero)
        return customSearchBar
    }()

    override var searchBar: UISearchBar {
        get {
            return _searchBar
        }
    }
}

然后在我使用的viewDidLoad中使用它:

let searchController = CustomSearchController(searchResultsController: nil)
//...configure the rest of the searchController...

//DELETE- searchController.searchBar.showsCancelButton -you can delete this line wherever your using it

问题解决了我

答案 3 :(得分:1)

我遇到同样的问题,如果你设置dimsBackgroundDuringPresentation = NOobscuresBackgroundDuringPresentation = NO,即使隐藏了取消按钮,你也会再次看到光标。

答案 4 :(得分:0)

将故事板中的搜索view色调颜色设置为您希望用作光标的任何颜色。

小心

  

view部分

中设置色调颜色

而不是searchBar部分,位于故事板中的attribute inspector

答案 5 :(得分:0)

对我来说,有效的解决方案是:

searchBar.setShowsCancelButton(false, animated: false)
searchBar.becomeFirstResponder()
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)

中的