有条件地为iOS8 +激活UISearchController

时间:2016-02-02 18:55:32

标签: swift ios7 uisearchbar uisearchdisplaycontroller uisearchcontroller

我有一个我想要定位到iOS 7的应用程序,但我目前无法这样做,因为它包含一个仅适用于iOS 8及更高版本的UISearchController。

我一直在尝试使用UISearchDisplayController修改搜索栏,以便它可以在iOS 7中运行,但我无法让它工作并且让我感到有些沮丧。所以作为一个临时措施(虽然我在编码方面做得更好),我想禁用任何低于8.0的iOS的搜索栏 - 这对最终用户的影响太大,因为它在一个更大的应用程序中只有一个屏幕

问题在于我还没有能够弄清楚如何有条件地做这件事(例如,#34;如果#available(iOS 8.0,*)")因为变量&# 34; searchController"和"控制器"在方法或函数之外定义,因此无法有条件地分配。我猜条件语句只能在函数和方法中使用? (还在学习,正如你所看到的那样)。

所以有人可以为我提供一种方法来有条件地禁用此处的搜索栏,以便我可以定位iOS 7吗?我的这个类的代码如下。谢谢!

class RegData2: UITableViewController, UISearchResultsUpdating {

    let model = Model()
    var prevArray = [String]()
    var selectionPrev = String()

    var filteredTableData = [String]()

    var searchController = UISearchController()
    let controller = UISearchController(searchResultsController: nil)


    override func viewDidLoad() {
        super.viewDidLoad()


        self.searchController = ({
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()

            self.tableView.tableHeaderView = controller.searchBar
            self.definesPresentationContext = true

            return controller

        })()

        // Reload the table
        self.tableView.reloadData()

    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (self.searchController.active) && (controller.searchBar.text != "") {
            return self.filteredTableData.count
        }
        else {
            return prevArray.count
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell!
        cell.textLabel?.font = UIFont.boldSystemFontOfSize(18)


        if (self.searchController.active) && (controller.searchBar.text != "") {
            cell.textLabel?.text = filteredTableData[indexPath.row]


            return cell
        }
        else {

            cell.textLabel?.text = prevArray[indexPath.row]

            return cell
        }
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        controller.searchBar.resignFirstResponder()
        performSegueWithIdentifier("regData2ToRegView", sender: self)    

    }       

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "regData2ToRegView" {

            let regView = segue.destinationViewController as! RegView
            let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!
            var selection : String = prevArray[indexPath.row]
            if (self.searchController.active) && (self.controller.searchBar.text != "") {
                selection = self.filteredTableData[indexPath.row]
            }
            else {
                selection = self.prevArray[indexPath.row]
            }

            regView.prevSelection = selection
            regView.prevSelectionType = selectionPrev


        }

    }

    func updateSearchResultsForSearchController(searchController: UISearchController)
    {


        if searchController.searchBar.text != ""{

            filteredTableData.removeAll(keepCapacity: true)

            let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)

            if self.selectionPrev != "ed" {
                let array = (self.prevArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
                filteredTableData = array as! [String]
//                edAlert = 0
            } else {
                let array = (self.prevArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
                filteredTableData = array as! [String]
//                edAlert = 1
            }

            self.tableView.reloadData()

        } else  {

            self.tableView.reloadData()
        }

    }

}

1 个答案:

答案 0 :(得分:0)

要检查版本,您可以执行以下操作:

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
    println("iOS >= 8.0")
case .OrderedAscending:
    println("iOS < 8.0")
}

但很可能你只需要检查该类是否可用然后实例化它:

if NSClassFromString("UISearchController") != nil { 
    // init and use ...
}

这被称为“弱联系”类。

修改
您也可以使用预处理器在编译之前包含/排除任何代码,即:

#if __IPHONE_8_0
    class RegData2: UITableViewController, UISearchResultsUpdating {
#else
    class RegData2: UITableViewController {
#endif

更多信息herehere以及here