【问题标题】:UISearchDisplayController in SwiftSwift 中的 UISearchDisplayController
【发布时间】:2015-01-27 20:54:22
【问题描述】:

我希望它完全像这样工作。 http://i.imgur.com/M1JigDY.png

我有一个带有左右栏按钮的导航栏。左栏按钮是搜索按钮。单击该按钮会将我带到此方法。

@IBAction func searchMap(sender: AnyObject) {

    self.navigationItem.rightBarButtonItem = nil
    var searchDispCont = UISearchDisplayController(searchBar: searchBar, contentsController: nil)
    self.navigationController?.navigationBar.addSubview(searchDispCont.searchBar)

    searchDispCont.searchBar.showsCancelButton = true
    searchDispCont.searchBar.tintColor = UIColor.lightGrayColor()
    searchDispCont.displaysSearchBarInNavigationBar = true
    searchDispCont.searchBar.becomeFirstResponder()
    searchDispCont.setActive(true, animated: true)
}

当点击搜索栏的取消按钮时,返回到原来的导航控制器。

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    // Need to go back to original state
    searchBar.hidden = true

    var listBtn = UIBarButtonItem(title: "List", style: UIBarButtonItemStyle.Plain, target: self, action: "goToList:")
    self.navigationItem.setRightBarButtonItem(listBtn, animated: false)

    var searchBtn = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "searchMap:")
    self.navigationItem.setLeftBarButtonItem(searchBtn, animated: false)
}

列表按钮工作正常。但是,再次单击搜索按钮并没有像应有的那样将我带回 searchMap() 方法。它会删除左侧导航栏按钮,但不会显示搜索栏。这是因为我已经创建了 searchDisplayController 吗?

我在搜索地图后也遇到了同样的问题。搜索地图后,搜索栏会消失,但是当我再次单击搜索按钮时,我遇到了同样的问题。这是那个方法。

func searchBarSearchButtonClicked( searchBar: UISearchBar!)
{
    var listBtn = UIBarButtonItem(title: "List", style: UIBarButtonItemStyle.Plain, target: self, action: "goToList:")
    self.navigationItem.setRightBarButtonItem(listBtn, animated: false)

    var searchBtn = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "searchMap:")
    self.navigationItem.setLeftBarButtonItem(searchBtn, animated: false)

    searchBar.resignFirstResponder()
    var found = false
    for bar in bars {
        var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
        var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

        var test = bar as BarAnnotation
        if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil {
            found = true
            var span = MKCoordinateSpanMake(0.005, 0.005)
            var region = MKCoordinateRegion(center: test.location, span: span)
            mapView.setRegion(region, animated: true)
            mapView.selectAnnotation(bar.annotation, animated: true)
        }
    }

    if found {
        // Need to go back to original state

        searchBar.hidden = true
        searchBar.text = ""
    }
    else{
        let alert = UIAlertView()
        alert.title = "Not Found"
        alert.message = "Not found. Please try your search again."
        alert.addButtonWithTitle("OK")
        alert.show()

        searchBar.text = ""
    }
}

有什么想法吗??

奖励:有没有办法根据手机动态调整搜索栏的大小?当我初始化它时,我说

var searchBar = UISearchBar(frame: CGRectMake(0, 0, 300, 20)) as UISearchBar

但这不是 iPhone 6 的正确值。

【问题讨论】:

    标签: ios search swift mapkit uisearchdisplaycontroller


    【解决方案1】:

    不敢相信我没有看到这个,但我只是需要

    searchBar.hidden = false
    

    在 SearchMap() 方法中。如果有人对此有任何建议,我仍然无法弄清楚动态调整大小。

    【讨论】:

    • 嗨@leerob我已经实现了相同的,但是当我点击取消按钮时,它不会调用方法searchBarCancelButtonClicked。结果搜索栏没有隐藏在点击取消按钮上。
    • @Daljeet 我相信您需要将搜索栏委托设置为您正在使用的任何类,以便它可以识别何时单击取消按钮。
    • 我已经添加了委托 UISearchControllerDelegate,UISearchBarDelegate。
    【解决方案2】:

    您可以将搜索栏分配给 searchBar.sizeToFit(),它会针对不同的设备动态调整搜索栏的大小。

    【讨论】:

    • 我还发现将searchBar设置为navigationBar.title并且不传入size参数会使其自动调整大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多