问:带有 swift 和 Xcode8.0 的 Storyboard 中的搜索栏和搜索显示控制器在 Appdelegate 崩溃

Q: Search Bar and Search Display Controller in storyboard with swift and Xcode8.0 crash at Appdelegate

故事板布局如下:

这是我的demo,不知道哪里出错了

ViewController中:

import UIKit
import Foundation

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!


@IBOutlet var searchDisplay: UISearchDisplayController!

var ctrls:[String] = ["Label","Button1-init","Button1-high","Button2-init","Button2-high","Switch"]

var ctrlsel:[String] = []

override func viewDidLoad() {
    super.viewDidLoad()
    
    self.ctrlsel = self.ctrls
    self.searchDisplay.searchResultsTableView.register(UITableViewCell.self,
                                                            forCellReuseIdentifier: "SwiftCell")

    self.searchDisplay.searchBar.placeholder = "input"

    //self.searchDisplay.searchBar.text = "b"

    self.searchDisplay.searchBar.prompt = "search"

    self.searchDisplay.searchBar.searchBarStyle = UISearchBarStyle.minimal

    self.searchDisplay.searchBar.showsScopeBar = true
    self.searchDisplay.searchBar.scopeButtonTitles = ["all","part","high"]
}

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    return self.ctrlsel.count
}


func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!)
    -> UITableViewCell!
{

    let identify:String = "SwiftCell"

    let cell = self.searchDisplay.searchResultsTableView.dequeueReusableCell(
        withIdentifier: identify, for: indexPath as IndexPath) as UITableViewCell
    cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
    cell.textLabel?.text = self.ctrlsel[indexPath.row]
    return cell
}

func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) {
    self.searchText = searchText
    searchCtrls()
}

func searchBar(searchBar: UISearchBar!, selectedScopeButtonIndexDidChange selectedScope: Int) {
    print(selectedScope)
    searchCtrls();
}

var searchText:String = ""


func searchCtrls() {

    if self.searchText == "" {
        self.ctrlsel = self.ctrls
    }
    else {
        var scope = self.searchDisplay.searchBar.selectedScopeButtonIndex;

        self.ctrlsel = []
        for ctrl in self.ctrls {
            let lc = ctrl.lowercased()
            if lc.hasPrefix(self.searchText) {
                if (scope == 0 || (scope == 1 && lc.hasSuffix("init"))
                    || (scope == 2 && lc.hasSuffix("high"))) {
                    self.ctrlsel.append(ctrl)
                }
            }
        }
    }
    

    // self.searchDisplay.searchResultsTableView.reloadData()
}

}

Appdelegate 崩溃。在 swift3Xcode 8.0 环境中。为了方便得到搜索结果,使用Search Bar and Search Display Controller in storyboard.

当我 运行 我的应用程序时,它在 Appdelegate.swift 中的这一行崩溃:class AppDelegate: UIResponder, UIApplicationDelegate 。中断信息是:Thread 1: breakpoint 2.1

编辑:

将tableView的dataSourcedelegate设置为vc后:出现奇怪的情况:searchbartableView[=26下面=]

我相信你设置的 datasource 和 tableview 的 delegate 不正确,请设置 datasourcedelegate 在界面生成器中,如下面的屏幕截图所示,

Select tableview 并在连接检查器中设置数据源。

或者您可以通过代码在 viewDidLoad() 方法中设置它们来完成此操作。将这些行粘贴到 viewDidLoad()

tableView.dataSource = self
tableView.delegate = self

正如我从您粘贴的代码片段中看到的那样,您已经实现了 UITableViewDelegate 和 UITableViewDataSource 方法。但是您没有提到您的 class 符合这些协议,因此修改您的 class 声明并指定您的 class 符合这些协议。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
//Your class implementation goes here
}