UITableViewCell按钮标记在UISearchController中返回所需的IndexPath,而不是FetchedResultsController

时间:2015-10-24 01:45:02

标签: ios uitableview core-data uibutton nsfetchedresultscontroller

我在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

1 个答案:

答案 0 :(得分:1)

  

我已经尝试了一些我在这里找到的其他方法,例如将CGPoints转换为IndexPaths等,但运气不佳。

翻译点确实是最强大的解决方案。 This answer包含正确的代码。