问:带有 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 崩溃。在 swift3
和 Xcode 8.0
环境中。为了方便得到搜索结果,使用Search Bar and Search Display Controller in storyboard
.
当我 运行 我的应用程序时,它在 Appdelegate.swift
中的这一行崩溃:class AppDelegate: UIResponder, UIApplicationDelegate
。中断信息是:Thread 1: breakpoint 2.1
编辑:
将tableView的dataSource
和delegate
设置为vc
后:出现奇怪的情况:searchbar
在tableView
[=26下面=]
我相信你设置的 datasource 和 tableview 的 delegate 不正确,请设置 datasource 和 delegate 在界面生成器中,如下面的屏幕截图所示,
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
}
故事板布局如下:
这是我的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 崩溃。在 swift3
和 Xcode 8.0
环境中。为了方便得到搜索结果,使用Search Bar and Search Display Controller in storyboard
.
当我 运行 我的应用程序时,它在 Appdelegate.swift
中的这一行崩溃:class AppDelegate: UIResponder, UIApplicationDelegate
。中断信息是:Thread 1: breakpoint 2.1
编辑:
将tableView的dataSource
和delegate
设置为vc
后:出现奇怪的情况:searchbar
在tableView
[=26下面=]
我相信你设置的 datasource 和 tableview 的 delegate 不正确,请设置 datasource 和 delegate 在界面生成器中,如下面的屏幕截图所示,
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
}