我有使用SearchField,從一個簡單的數組搜索和過濾數據,然後爲用戶顯示過濾的數據點擊,但我發現這是造成錯誤與TableViewController的應用我的整個應用程序崩潰。斯威夫特的UITableViewController搜索錯誤 - [NSInternalInconsistencyException]
當我第一次運行應用程序時,我得到的最後擊殺前兩次警告當我鍵入一個字母進入搜索領域。這裏的每個實例的屏幕截圖,每個控制檯錯誤沿着我得到:
1控制檯登錄:
2017-01-09 21:20:30.060553
[Warning] Attempting to load the view of a view controller while
it is deallocating is not allowed and may result in
undefined behavior
(<UISearchController: 0x7f9d235055b0>)
第二控制檯日誌:
2017-01-09 21:21:18.570764
[MC] System group container for
systemgroup.com.apple.configurationprofiles path is
/Users/zanaaziz/Library/Developer/CoreSimulator/Devices/
3A5A6007-4A7E-4DAF-8E41-4B4A5A7FB0A4/data/Containers/Shared/SystemGroup/
systemgroup.com.apple.configurationprofiles
2017-01-09 21:21:18.571643
[MC]Reading from private effective user settings.
最後的控制檯登錄:
2017-01-09 21:21:45.278
*** Assertion failure in -[UITableView
dequeueReusableCellWithIdentifier:forIndexPath:],
/BuildRoot/Library/Caches/
com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.6.21/UITableView.m:6600
2017-01-09 21:21:45.283 Kurdish Dictionary[66678:6174997]
***Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: 'unable to dequeue a cell
with identifier cell - must register a nib or a class for the
identifier or connect a prototype cell in a storyboard'
*** First throw call stack:
(
0 CoreFoundation 0x0000000106078d4b
__exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010298721e
objc_exception_throw + 48
2 CoreFoundation 0x000000010607ce42
[NSException raise:format:arguments:] + 98
3 Foundation 0x0000000102f9466d -
[NSAssertionHandler
handleFailureInMethod:object:file:lineNumber:description:] + 195
4 UIKit 0x000000010399d1e8
[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] + 259
5 Kurdish Dictionary 0x00000001028dd326 _TFC18Kurdish_Dictionary25SearchTableViewController9tableViewfTCSo11UITableView12cellForRowAtV10Foundation9IndexPath_CSo15UITableViewCell + 150
6 Kurdish Dictionary 0x00000001028dd627 _TToFC18Kurdish_Dictionary25SearchTableViewController9tableViewfTCSo11UITableView12cellForRowAtV10Foundation9IndexPath_CSo15UITableViewCell + 87
7 UIKit 0x00000001039b0584 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 757
8 UIKit 0x00000001039b07e2 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 74
9 UIKit 0x00000001039842b0 -[UITableView _updateVisibleCellsNow:isRecursive:] + 3295
10 UIKit 0x00000001039b9b64 -[UITableView _performWithCachedTraitCollection:] + 110
11 UIKit 0x00000001039a03be -[UITableView layoutSubviews] + 222
12 UIKit 0x0000000103907ab8 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1237
13 QuartzCore 0x0000000108ed5bf8 -[CALayer layoutSublayers] + 146
14 QuartzCore 0x0000000108ec9440 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
15 QuartzCore 0x0000000108ec92be _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
16 QuartzCore 0x0000000108e57318 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 280
17 QuartzCore 0x0000000108e843ff _ZN2CA11Transaction6commitEv + 475
18 QuartzCore 0x0000000108e84d6f _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 113
19 CoreFoundation 0x000000010601d267 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
20 CoreFoundation 0x000000010601d1d7 __CFRunLoopDoObservers + 391
21 CoreFoundation 0x0000000106001f8e __CFRunLoopRun + 1198
22 CoreFoundation 0x0000000106001884 CFRunLoopRunSpecific + 420
23 GraphicsServices 0x0000000107fcfa6f GSEventRunModal + 161
24 UIKit 0x0000000103842c68 UIApplicationMain + 159
25 Kurdish Dictionary 0x00000001028dc1ef main + 111
26 libdyld.dylib 0x000000010702868d start + 1
27 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type
NSException
(lldb)
而且這是我的SWIFT代碼:
import UIKit
class SearchTableViewController: UITableViewController, UISearchResultsUpdating {
let data = ["Aftershock","Asses","Apple","Alien"]
var filteredData = [String]()
var resultSearchController = UISearchController()
override func viewDidLoad() {
super.viewDidLoad()
self.resultSearchController = UISearchController(searchResultsController: nil)
self.resultSearchController.searchResultsUpdater = self
self.resultSearchController.dimsBackgroundDuringPresentation = false
self.resultSearchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = self.resultSearchController.searchBar
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.resultSearchController.isActive){
return self.filteredData.count
}else{
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell?
// Configure the cell...
cell!.textLabel?.text = self.filteredData[indexPath.row]
return cell!
}
func updateSearchResults(for searchController: UISearchController) {
self.filteredData.removeAll(keepingCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.data as NSArray).filtered(using: searchPredicate)
self.filteredData = array as! [String]
self.tableView.reloadData()
}
}
老實說任何幫助將是金對我來說,因爲它的殺了我! 謝謝你的時間。
它工作!非常感謝!!我仍然收到前兩個警告,不知道是什麼原因造成的? –
第二個日誌不是警告。至於第一個,請參閱http://stackoverflow.com/questions/32704169/attempting-to-load-the-view-of-a-view-controller-while-it-is-deallocating-ui。而不是創造的'UISearchController'兩次,你應該聲明變量存儲控制器可選的(在你的情況下,它不應該傷害有它含蓄地展開:'VAR resultSearchController:UISearchController',而不是'VAR resultSearchController = UISearchController()' )。這樣,編譯器不會抱怨未初始化的變量。 – crizzis
爲了這個工作,請確保你也從'viewDidLoad'中刪除了對'self.tableView.reloadData()'的不必要的調用。 – crizzis