我在Swift 2.0的Core Data项目中的NSFetchedResultsController
上实现了UITableView
。另外,我实施了UISearchController
。除了我在自定义UITableViewCell
按钮上遇到的行为外,一切都很完美。
当UISearchController
处于活动状态时,customTableViewCell
的按钮可以正常工作。如果我在fetchedResultsController
显示其结果时单击相同按钮,则无论我单击哪个按钮,该方法都认为索引0是发件人。
func playMP3File(sender: AnyObject) {
if resultsSearchController.active {
// ** THIS WORKS **
// get a hold of my song
// (self.filteredSounds is an Array)
let soundToPlay = self.filteredSounds[sender.tag]
// grab an attribute
let soundFilename = soundToPlay.soundFilename as String
// feed the attribute to an initializer of another class
mp3Player = MP3Player(fileName: soundFilename)
mp3Player.play()
} else {
// ** THIS ALWAYS GETS THE OBJECT AT INDEX 0 **
let soundToPlay = fetchedResultsController.objectAtIndexPath(NSIndexPath(forRow: sender.tag, inSection: (view.superview?.tag)!)) as! Sound
// OTHER THINGS I'VE TRIED
// let soundToPlay = fetchedResultsController.objectAtIndexPath(NSIndexPath(forRow: sender.indexPath.row, inSection: (view.superview?.tag)!)) as! Sound
// let soundToPlay: Sound = fetchedResultsController.objectAtIndexPath(NSIndexPath(index: sender.indexPath.row)) as! Sound
let soundFilename = soundToPlay.soundFilename as String
mp3Player = MP3Player(fileName: soundFilename)
mp3Player.play()
}
}
这是我的cellForRowAtIndexPath
的缩写版本,以显示我正在设置单元格的按钮:
let customCell: SoundTableViewCell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! SoundTableViewCell
if resultsSearchController.active {
let sound = soundArray[indexPath.row]
customCell.playButton.tag = indexPath.row
} else {
let sound = fetchedResultsController.objectAtIndexPath(indexPath) as! Sound
customCell.playButton.tag = indexPath.row
}
// add target actions for cells
customCell.playButton.addTarget(self, action: "playMP3file:", forControlEvents: UIControlEvents.TouchUpInside)
我尝试过其他一些我在这里找到的方法,例如将CGPoints
翻译成IndexPaths
等等,但运气不佳。当我点击模拟器中的按钮时,编译器中看起来很有希望的一切都崩溃了。
感谢您的阅读。
更新 安装Xcode 7.1,重新启动,清理缓存,核心派生数据,做了冷启动。
解决方案
标签将在许多情况下完成工作(例如获取Array
中的位置)并在此获得大量选票,但正如我所知,它们并不是一直都在工作。感谢Mundi为我指出了一个更强大的解决方案。
// this gets the correct indexPath when resultsSearchController is not active
let button = sender as! UIButton
let view = button.superview
let cell = view?.superview as! SoundTableViewCell
let indexPath: NSIndexPath = self.tableView.indexPathForCell(cell)!
let soundToPlay = fetchedResultsController.objectAtIndexPath(indexPath) as! Sound
答案 0 :(得分:1)
我已经尝试了一些我在这里找到的其他方法,例如将CGPoints转换为IndexPaths等,但运气不佳。
翻译点确实是最强大的解决方案。 This answer包含正确的代码。