繁体   English   中英

Swift UITableViewController搜索错误-[NSInternalInconsistencyException]

[英]Swift UITableViewController Search Error - [NSInternalInconsistencyException]

我有一个带有TableViewController的应用程序,该应用程序使用SearchField来搜索和过滤来自简单数组的数据,然后显示过滤后的数据供用户单击,但我遇到了导致我的整个应用程序崩溃的错误。

当我第一次运行该应用程序时,在搜索字段中键入字母时,我会在最终杀死之前收到两个警告。 这是每个实例的屏幕快照以及我得到的每个控制台错误:

运行后: 在发射时

第一个控制台日志:

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) 

这是我的快速代码:

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()
    }
}

老实说,任何帮助对我来说都是金子,因为它杀死了我! 谢谢你的时间。

由于您使用的是UITableViewCell.textLabel属性,因此我假设您要使用UITableViewCell的默认样式之一。

您试图调用tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)而无需使用此类标识符注册可重用单元格。 您的代码缺少对viewDidLoad tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM