swift - 调用 TableViewCell 中的函数后变量变为 nil

标签 swift string uitableview url avplayer

我试图将 URL 传递给 UITableViewCell 类中的多个函数。在 @objc 函数(用于处理按钮触摸)中,字符串变量 (videoString) 工作得很好。常规函数在解开字符串时不断查找 nil。

我已经尝试过调整可选的展开(?/!)。无论我做什么,该函数都会发现 nil。为了测试这一点,我将 @objc 添加到有问题的函数中,当我单击连接按钮时它实际上起作用了。

var videoString = String()

这个有效:

var parent:Home?
@objc func shareSheet() {
    let items = [URL(string: videoString)!]
    let ac = UIActivityViewController(activityItems: items, 
    applicationActivities: nil)
    parent?.present(ac, animated: true)
}

这也是:

@objc func setupPlayerView() {
    let videoURL = videoString
    if let url = URL(string: videoURL) {
        player = AVPlayer(url: url as URL)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = videoFrame.bounds
        videoFrame.layer.addSublayer(playerLayer)
        player?.play()
    } else {
        print("Invalid")
    }
}

这个不...

func setupPlayerView() {
    let videoURL = videoString
    if let url = URL(string: videoURL) {
        player = AVPlayer(url: url as URL)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = videoFrame.bounds
        videoFrame.layer.addSublayer(playerLayer)
        player?.play()
    } else {
        print("Invalid")
    }
}

单元格样式:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    setupPlayerView()
    addSubview(videoFrame)
    addSubview(share)

    share.addTarget(self, action: #selector(shareSheet), for: .touchUpInside)

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

我希望 setupPlayerView() 接受 videoString,但它总是找到 nil 并打印“Invalid”。我认为这与闭包有关,因为其他函数正确地接受了它。

最佳答案

更新

我通过声明 URL 并将其传递给位于 cellForRowAt 的 TableView 文件中的 AVPlayer 来使其工作:

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 
-> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! EpisodeCell
    let currentLastItem = episodes[indexPath.row]
    cell.episode = currentLastItem
    let videoURL = currentLastItem.videoString
    let postURL = URL(string: videoURL)
    cell.videoPlayerItem = AVPlayerItem.init(url: postURL!)
    return cell
}

然后到TableViewCell内部的函数:

    func setupPlayerView() {
        self.player = AVPlayer.init(playerItem: self.videoPlayerItem)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = videoFrame.bounds
        videoFrame.layer.addSublayer(playerLayer)
        player?.play()
    }

关于swift - 调用 TableViewCell 中的函数后变量变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881565/

相关文章:

ios - 以编程方式生成顶点

java - 将一个字符串分成两部分

iphone - 重命名表格 View 中的标准 "edit"按钮

objective-c - 如何设置章节标题以使用 UITableView 样式分组?

c# - 运算符 ||不能应用于类型 bool 和 string/string 和 string

ios - 显示结果后关闭 UISearchBar

json - 将 NSData 对象转换为 NSDictionary 时出现问题

swift - 如何在单元格末尾添加 CollectionView 自定义单元格?

ios - Swift 显示来自 viewController 的 jpg 图片

java - Java 中一个字符是 1 个字节还是 2 个字节?