我正在尝试将 a 添加UISearchController到以编程方式创建UITableView的UIViewController类中。这是我的代码:
var resultSearchController = UISearchController()
var myTableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
myTableView.frame = CGRectMake(0, 0, view.bounds.width, view.bounds.height)
myTableView.delegate = self
myTableView.dataSource = self
myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self //ERROR
controller.searchBar.delegate = self //ERROR
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
self.myTableView.tableHeaderView = controller.searchBar
return controller
})()
UIApplication.sharedApplication().keyWindow?.addSubview(myTableView)
}
Run Code Online (Sandbox Code Playgroud)
我得到的两个错误是
- Cannot assign a value of type 'ViewController' to a value of type 'UISearchBarDelegate? …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个searchController,因此我试图使其根据UISearchController中的文本过滤内容。我创建了一个自定义对象,如下所示。我试过使用NSPredicate,但一直得到:
cannot convert value of type NSPredicate to expected type @noescape (organization) throws...
class Organization: Object {
var id: Int = 0
var name: String = ""
var shortName: String = ""
var image: NSData = NSData()
var pinImage: NSData = NSData()
let locations = List<Location>()
}
Run Code Online (Sandbox Code Playgroud)
然后,我sortedLocations在ViewController中调用了一个数组,其中包含许多Organization对象。
到目前为止,我已经尝试过:
func updateSearchResultsForSearchController(searchController: UISearchController)
{
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF.name CONTAINS[c] %@", searchController.searchBar.text!)
let array = sortedLocations.filter(searchPredicate)
filteredTableData = array as! [Organization]
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud) 我将UISearchController()添加到我的UIViewController中,如下所示:
class SearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {
let tableData = ["Here's", "to", "the", "crazy"]
var filteredTableData = [String]()
var resultSearchController = UISearchController()
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.dataSource = self
self.tableView.delegate = self
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Reload the table
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
... TableView功能......
func updateSearchResultsForSearchController(searchController: UISearchController)
{
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", …Run Code Online (Sandbox Code Playgroud) 问题:
我有一个表视图,用户可以滚动查找内容或使用搜索栏.搜索栏不是使用StoryBoard创建的.我的视图有一个UISearchController处理搜索栏和搜索结果更新.我遇到的问题是,由于我SearchResultsController是由另一个控制器实例化的,我不能执行另一个视图的segue,或者至少我找不到解决方案.除了我的搜索结果控制器和它注定的视图之间的segue之外,一切都有效.
我想做什么
有我的MyNavTableViewController代表MySearchResultsController.在搜索结果控制器中,当用户点击a时,它将转到另一个视图TableViewCell.我没有使用StoryBoard来实现这一点我很难使用segues转换到另一个视图.
如果我不能让这个工作,我可能会做:
我必须在视图之间传递信息,对我来说,我总是使用segues来完成它.但是,如果这不起作用,我可能会尝试通过将其推送到导航控制器堆栈并将数据写入共享数据库或其他内容来模态地呈现视图.我宁愿使用segue.
研究: 肯定不止于此,但我不会在网址上占用太多空间.
我的设置
我将尝试尽可能简洁.代码比我正在显示的代码多.我只是想尝试清理它,以便我只展示重要的东西.我也在改变一些名字,因为可能有敏感的信息.这可能不是什么大问题,但我宁愿保持安全.
class MyNavTableViewController: UIViewController, UITableViewDataSource{
//this is
@IBOutlet weak var tableView: UITableView!
var searchController: UISearchController!
override func viewDidLoad(){
...code
tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: tblId)
let resultsController = MySearchResultsController()
resultsController.databaseFilePath = databaseFilePath()
//this is essential that I use a segue because between my views I'm passing information between them.
resultsController.photo = photo!
searchController = UISearchController(searchResultsController: resultsController)
let searchBar = searchController.searchBar
searchBar.placeholder = searchBarPlaceHolderText …Run Code Online (Sandbox Code Playgroud) 我有一个非常奇怪的问题,我无法弄清楚这里出了什么问题。
这是我的代码
func updateSearchResultsForSearchController(searchController: UISearchController) {
filterTableData.removeAll(keepCapacity: false)
let searchWord = searchController.searchBar.text!
getCountriesNamesFromServer(searchWord)
let searchPredict = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
newTableData = [String]()
for var i = 0; i < self.dict.count - 1; i++ {
let cityName = (((self.dict["\(i)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String
let countryName = (((self.dict["\(i)"] as?NSDictionary)!["Country"] as?NSDictionary)!["name"] as?NSString)! as String
print("countryName is \(countryName)")
newTableData.append(cityName)
}
print("newTableData is \(newTableData)" )
let array = (newTableData as NSArray).filteredArrayUsingPredicate(searchPredict)
print("array is\(array)")
filterTableData = array as! [String]
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
程序在这一行崩溃
let …Run Code Online (Sandbox Code Playgroud) 我实现了UISearchController,我从js回调中获取数据但是当我在磁带中使用searchbar它需要一些时间来放置数据,所以我想知道如何实现加载indicator到表视图中的结果UISearchController
将我们的代码应用于 iOS 11,我正在努力解决 UINavigationController 中定位的 UISearchbar。我像这样设置 SearchController/SearchBar:
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchBar.scopeButtonTitles = @[@"foo", @"bar"];
self.searchController.searchBar.showsScopeBar = YES;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = YES;
if (@available(iOS 11.0, *))
{
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = YES;
UISearchBar *searchbar = self.searchController.searchBar;
[searchbar setSomeColors];
}
Run Code Online (Sandbox Code Playgroud)
当使用我们的默认颜色时,事情可能看起来不错,但 SearchBar 和 ScopeButtons 之间的空间可能有点太大:
更改搜索栏的 backgroundColor 揭示出了什么问题:

因此,UISearchBar 在其父视图中的位置有点太高了。有谁知道,是什么导致了 iOS 11 中的这种行为?
如何删除UISearchControlleriOS 11下的行?
我添加了UISearchController使用此代码:
navigationItem.searchController = searchController
Run Code Online (Sandbox Code Playgroud)
但这样做之后,它下面有一条奇怪的线:
任何关于如何去除线条或至少选择其颜色的建议将不胜感激。
iOS 11搜索栏在输入时一直在消失我试图设置searchController.hidesNavigationBarDuringPresentation = false也是searchController.definesPresentationContext = true这里是一个正在发生的事情的视频
我的代表职能
func updateSearchResults(for searchController: UISearchController) {
filarr = arr.filter({ (arr:String) -> Bool in
if arr.contains(searchController.searchBar.text!){
return true
}else{
return false
}
})
resultController.tableView.reloadData()
}
//Assigning the searchbarcontroller
if #available(iOS 11.0, *) {
self.navigationController?.navigationBar.prefersLargeTitles = true
self.navigationItem.searchController = searchController
self.navigationItem.hidesSearchBarWhenScrolling = false
} else {
tableView.tableHeaderView = searchController.searchBar
}
Run Code Online (Sandbox Code Playgroud) ios ×9
swift ×8
ios11 ×3
loading ×1
objective-c ×1
swift2 ×1
uisearchbar ×1
uitableview ×1
xcode9 ×1