数组索引超出范围
Posted
技术标签:
【中文标题】数组索引超出范围【英文标题】:Array index out of range 【发布时间】:2016-03-15 15:02:03 【问题描述】:我已经成功构建了一个搜索功能,它可以在 detailviewcontroller 中搜索并显示 TableView 标题和副标题。在 detailviewcontroller 中有两个文本标签,一个用于标题,一个用于副标题。
在单元格中显示标题和副标题可以正常工作,包括在 detailviewcontroller 中点击和查看它们。但是在输入搜索功能时,应用程序崩溃,原因是:
致命错误: (lldb)
EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
这是我所有的代码:
let quotes = [
"Saying1",
"Saying2",]//End
let persons = [
"Name1",
"Name2",
]//End
var filteredQuotes = [String]()
var filteredPersons = [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 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
if self.resultSearchController.active
return self.filteredQuotes.count
else
return self.quotes.count
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell?
if self.resultSearchController.active
cell!.textLabel?.text = self.filteredQuotes[indexPath.row]
cell!.detailTextLabel?.text = self.filteredPersons[indexPath.row] //THE ERROR OCCURS HERE
else
cell!.textLabel?.text = self.quotes[indexPath.row]
cell!.detailTextLabel?.text = self.persons[indexPath.row]
return cell!
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "SendDataSegue"
if let destination = segue.destinationViewController as? SearchDetailViewController
let path = tableView.indexPathForSelectedRow
let cell = tableView.cellForRowAtIndexPath(path!)
destination.viaSegue = (cell?.textLabel?.text!)!
destination.viaSeguePerson =(cell?.detailTextLabel?.text!)!
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
_ = tableView.indexPathForSelectedRow!
if let _ = tableView.cellForRowAtIndexPath(indexPath)
self.performSegueWithIdentifier("SendDataSegue", sender: self)
func updateSearchResultsForSearchController(searchController: UISearchController)
self.filteredQuotes.removeAll(keepCapacity: false)
self.filteredPersons.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS [c] %@", searchController.searchBar.text!)
let Quotesarray = (self.quotes as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredQuotes = Quotesarray as! [String]
let Personsarray = (self.persons as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredPersons = Personsarray as! [String]
self.tableView.reloadData()
【问题讨论】:
发布完整的崩溃日志并正确标记您的问题(删除xcode
并添加swift
)。
filteredPersons
是否包含您认为它包含的数据?你记录了内容吗?为什么将数据存储在 2 个单独的数组中?在我看来,这句话像是属于一个人的,对吧?为什么不创建一个名为Quote
的对象,其中包含一个字符串作为引号和一个字符串作为名称?然后你只需要一个名为quotes
的数组或其他东西。
什么可以保证Quotesarray
和Personsarray
包含相同数量(顺便说一下对应的)数据?例如:引用@“我认为;因此我在”等带有“René Descartes”的人,您搜索“Descartes”,Quotesarray
和Personsarray
应该有什么?
你能在 Github 上分享你的代码吗,我想我知道你的问题是什么,但我需要先看看你的完整代码
@***foe 谢谢,完整的崩溃日志是 (正如@Larme 和@Fogmeister 所建议的那样,您可以使用结构化数组来改进这一点 - 这是您可以如何做这部分的示例。
定义一个结构来保存这样的数据
struct Quotes
var person : String
var quote : String
然后像这样初始化它
let quotes = [Quotes(person: "name 1", quote: "saying 1"),
Quotes(person: "name 2", quote: "saying 2") ]
当然,您也可以初始化一个空数组,然后在从某个位置(数据库或用户输入)检索数据时附加数据
var quotes : [Quotes] = []
let quote1 = Quotes(person: "name 3", quote: "saying 3")
quotes.append(quote1)
或
quotes.append(Quotes(person: "name 4", quote: "saying 4"))
【讨论】:
谢谢!但是我如何在代码的其他部分实现新数组呢? (例如 dequeueReusableCellWithIdentifier 和 updateSearchResultsForSearchController 函数)?我的意思是让一切都一起工作?非常感谢您的帮助@Russell 与您已经完全一样 - 但不是使用两个数组,而是有一个带有属性的数组 - 所以quotes[index].person和quotes[index].quote,而不是person[index] 和 quote[index] 我在 updateSearchResultsForSearchController 中收到关于 let Quotesarray = (self.quotes as NSArray).filteredArrayUsingPredicate(searchPredicate) 行的错误。上面写着“无法强制将 '[SearchTableViewController.Quotes]' 类型的值转换为 'NSArray' 类型”我为我的经验不足深表歉意,再次感谢您。 这里有一个很好的例子来解决这个问题 - ***.com/questions/31276848/… 问题是 self.quotes 不是一个简单的数组,它是一个结构体的自定义数组,但是看看前面的回答 我似乎无法弄清楚,我已尝试实现您链接的示例,但现在搜索功能根本不起作用 - 搜索时没有任何显示。 :(以上是关于数组索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章