在TableView中从UITableViewCell显示UIAlertView

时间:2015-08-10 02:15:01

标签: swift uitableview delegates uialertview

初学者。很难理解代表以及如何实现它们。

我有一个TableViewCell,用于确定是否存在音频文件。 如果没有音频文件,则在tableView中显示包含tableViewCell的alertView。我被告知使用代理会解决这个问题,但不知道如何使用它们。

以下是TableViewCell的代码,它决定是否显示警告:

    class TablePostCellView: UITableViewCell, AVAudioPlayerDelegate {
    ...
    @IBAction func playAudio(sender: AnyObject) {
    //self.post?.audioObject.parsePlaySound()
    if self.post?.audioObject.parseSoundPlayBack == nil{
        println("no audio show alert")
    } else{
        println("playAudio")
        parseSoundPlayBack.play()
    }
}

我读到这个:Presenting UIAlertController from UITableViewCell但它并没有真正帮助我。

1 个答案:

答案 0 :(得分:4)

很多人会告诉你在UITableView和UITableViewCell之间实现委托/协议模式。它们通常意味着这样的事情:

protocol AudioPlayable {
    func playSoundsIfAble()
}

class SomeCell: UITableViewCell {
    var delegate: AudioPlayable?
    @IBAction func userDidSomething(sender: AnyObject) {
        delegate?.playSoundsIfAble()
}

class SomeTableView: UITableViewController {
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeReusableCellWithIdentifier("abcd") as SomeCell!
        cell.delegate = self
        return cell
    }

    func playSoundsIfAble() {
        //Play the sound or show the alert
    }
}

但是,与代理协议模式一样常见的是,为什么不先走到曲线前,在Swift中将其作为一等公民的功能呢!

在某些情况下,这是另一种可能很好的方法:

class SomeTableView: UITableViewController, UITableViewDataSource {
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("abcd") as! SomeClass
        cell.playSpecificAudioFile = {
            //Grab a specific audio file that corresponds with this specific cell, and play it
            //Since this is being written on the TableView, and not the Cell, 
            //you probably have access to all the data source stuff you need
            //and are much better suited to lining up the indexPath and dataSource here 
        }
        return cell
    }
}

private typealias PlaySpecificAudioFile = () -> ()

class SomeClass: UITableViewCell {
    private var playSpecificAudioFile: PlaySpecificAudioFile?
    @IBAction func userDidSomething(sender: AnyObject) {
        playSpecificAudioFile?()
    }
}