- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 SearchBar 和 TableView 有一个非常奇怪的问题。我有一个带有此搜索栏的 map View ,您可以在搜索栏中搜索地点名称,我用数据库过滤名称,如果名称存在,它将添加到 TableView 中。我可以毫无问题地搜索它,但我遇到了两个奇怪的问题。如果我在 TableView 中获得 3-4 个值,如果我搜索第五个值,则该值将不会显示。我遇到的第二个问题是,如果我有类似的地名,并且我单击两个之一,如果我尝试第二次研究它,则表格 View 将仅显示我之前单击的名称,如果我尝试单击它第三次,我尝试研究它,桌面 View 不会显示它。(当我单击 TableView 上的值时,它会简单地在 map 上显示它。)
错误视频:https://streamable.com/e72wn
代码:
extension LocationSearchTable : UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
//print("updateSearchResults")
// *When user open the Search Bar and he doesn't type text or the text is very short this code clean the TableView.*
let searchText = searchController.searchBar.text
if searchText == nil || searchText!.isEmpty {
seenNames.removeAll()
matchingItems.removeAll()
self.tableView.reloadData()
}
guard let mapView = mapView else { return }
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchText
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let response = response else {
return
}
for (index , name) in response.mapItems.enumerated() {
let item = response.mapItems[index]
if(checkIfNameExistInDB(key: String(name.name!)) != nil && !seenNames.contains(name.name!)){
matchingItems.append(item)
seenNames.insert(name.name!)
self.tableView.reloadData()
}
else {
print(name.name!)
}
}
}
}
}
TableView的代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
let selectedItem = matchingItems[indexPath.row].placemark
cell.textLabel?.text = selectedItem.name
cell.imageView?.image = imageWithImage(image: UIImage(named: "search_1x")!, scaledToSize: CGSize(width: 20, height: 20))
cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
return cell
}
在出现第一个名称的错误后,搜索栏看起来被阻止并且不搜索任何内容
最佳答案
您的第一个问题是由输入搜索词时产生的大量请求引起的,因为输入或删除的每个字符都会创建并启动一个新的 MKLocalSearch。为了验证这一点,我将类似您的代码的内容放在 Playground 中并进行了测试:
import PlaygroundSupport
import UIKit
import MapKit
PlaygroundPage.current.needsIndefiniteExecution = true
var searches = [MKLocalSearch]()
for i in 1...100 {
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "Via roma n. \(i), Roma"
let search = MKLocalSearch(request: request)
search.start { (response, error) in
guard error == nil else {
print("request \(i) finished with error \(error!.localizedDescription)")
return
}
guard let _ = response else {
print("request \(i) finished with no response")
return
}
print("request \(i) completed successfully!")
}
searches.append(search)
}
您将看到某些请求已完成,没有错误,而对于某些请求,您将收到
The operation couldn’t be completed. (MKErrorDomain error 3.)
这是 MKErrorLoadingThrottled。这个错误,根据Apple dev ,发生在
The data was not loaded because data throttling is in effect. This error can occur if an app makes frequent requests for data over a short period of time.
进一步根据Apple dev :
There are no request limits per app or developer ID, so well-written apps that operate correctly should experience no problems. However, throttling may occur in a poorly written app that creates extremely large numbers of requests.
所以最后,问题的解决方案可能是延迟搜索请求的开始,直到用户完成输入(您可以使用一个计时器,当用户在一段时间内没有按任何键盘键时触发) .)
PS:非常重要的是,请记住在开始新请求之前取消您之前的请求,否则您会遇到意想不到的行为
关于swift - 奇怪的TableView和SearchBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50833507/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!