- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Swift 新手,所以要温柔。
我目前使用的是 Xcode 7 Beta。
我有一个嵌套在 NavigationController 中的 TableViewController。在 TableView 中,我实现了类似于步骤 here 的 UISearchBar
和 UISearchDisplayController
。几乎一切都按预期工作,除了当我输入搜索条件时,UISearchDisplayController
的结果 TableView 未填充。当我在搜索中点击取消时,结果已填充到初始 TableView 中。
我链接到的教程是预先填充项目列表,搜索栏正在过滤这些项目。我的方法有所不同,因为我是从外部 API 填充搜索。
我的问题有两个:
a) 如何正确填充结果 TableView?
b) 这两个 TableView 似乎多余,我认为第一个没有必要(可能是错误的)。实现此功能的正确方法是什么?理想情况下,我希望能够将 UISearchBar
放入导航项中,以便它位于 UINavigationBar
中,但我很难找到执行此操作的资源。
import UIKit
import Alamofire
import SwiftyJSON
import Foundation
class DSTableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {
var songs: [Song] = []
var timer: NSTimer = NSTimer()
func getSongs(timer: NSTimer!) {
let searchTerm = timer.userInfo as! String
self.title = "Results for \(searchTerm)"
// logic to switch service; need to eventually move this to an interface
// or move this code inside a rest API, and then into an interface
// URL encode the search term
let searchTermEncoded = searchTerm.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
// create the url for the web request
let uri: String = "https://api.spotify.com/v1/search?q=\(searchTermEncoded!)&type=artist,album,track"
// call to Spotify API
Alamofire
.request(.GET, uri)
.response { request, response, data, error in
let json = JSON(data: data!)
print(json["tracks"]["items"].count);
print(json["tracks"]["items"])
for var i = 0; i < json["tracks"]["items"].count; i++ {
let data = json["tracks"]["items"][i]
// return the object list
let song = Song()
song.title = data["name"].string!
song.album = data["album"]["name"].string!
song.artist = data["artists"][0]["name"].string!
self.songs += [song]
}
dispatch_async(dispatch_get_main_queue()) {
self.tableView!.reloadData()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
timer.invalidate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("getSongs:"), userInfo: searchString, repeats: false)
return true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return songs.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("SongCell", forIndexPath: indexPath)
let song = songs[indexPath.row]
cell.textLabel?.text = song.title
cell.detailTextLabel?.text = song.artist + " - " + song.album
cell.imageView?.image = song.albumImage
return cell
}
}
当我打电话时
func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
self.getSongs(searchString)
return true
}
我能够正确填充 View ,但我希望有延迟,这样我就不会在每次文本更改时都进行 API 调用。
希望我的解释是正确的。如果我不清楚或遗漏了什么,请随时编辑问题。
最佳答案
所以我最终得到了我想要的功能,并最终回答了我的问题:正确的方法是什么。事实证明,我正在尝试将方钉装入圆孔中。
我最终做的是完全删除 UISearchDisplayController
,而只是创建一个 UISearchBar
并将其分配给我的 self.navigationItem.titleView
。这删除了搜索 Controller 的一些内置功能,但也为我提供了一种更简洁的方式来完成我需要做的事情,而不必担心愚蠢的解决方法。我的代码大致类似于
class TableViewController: UISearchBarDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let searchBar: UISearchBar = UISearchBar()
searchBar.placeholder = "Search"
searchBar.delegate = self
self.navigationItem.titleView = searchBar
self.definesPresentationContext = true
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
timer.invalidate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "getResults:", userInfo: searchText, repeats: false)
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
}
这种方法为我提供了我正在寻找的功能(能够延迟对 API 的调用,直到用户完成输入),而且我还能够删除一些无关的代码。希望这对将来的人有所帮助。
关于ios - 填充 UISearchBarController 结果 TableView 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193560/
我的导航栏添加了搜索栏图标。 点击搜索栏按钮会实例化 UISearchBarController。 一切正常,除了“取消”按钮点击传播到下面的导航栏按钮(关闭当前模式)。 点击此处取消: 还可以在此处
我正在使用以下数组结构来创建一个带有部分的 tableView struct words { var sectionName : String! var coptic : [Strin
我使用的 UINavigationBar 始终隐藏(我使用 NavigationBar 设施来推送 ou 弹出 View ,但我没有将其显示给最终用户),问题是在其中一个 View 中我有一个带有 U
我对 UISearchBar/UISearchBarDelegate 和 UISearchBarController 之间的区别感到困惑。 现在,这就是我正在做的来实现我的搜索栏: class Sea
我是 Swift 新手,所以要温柔。 我目前使用的是 Xcode 7 Beta。 我有一个嵌套在 NavigationController 中的 TableViewController。在 Table
有没有人知道如何将 Firebase 合并到 UISearchController 委托(delegate)中?我找不到任何关于它的可靠信息。可能有数千名员工。 我知道如何使用搜索 Controlle
我正在尝试在 UICollectionViewController 中实现 UISearchBarController,代码如下: class FirstViewController: UIC
我是一名优秀的程序员,十分优秀!