为啥 Swift 3 不能识别我的按钮点击?

Posted

技术标签:

【中文标题】为啥 Swift 3 不能识别我的按钮点击?【英文标题】:Why Doesn't Swift 3 recognize me button tap?为什么 Swift 3 不能识别我的按钮点击? 【发布时间】:2017-03-21 21:40:33 【问题描述】:
 let playButton: UIButton = 
    let button = UIButton()
    let image = UIImage(named: "VideoIcon.png") as UIImage?
    button.backgroundImage(for: .normal)
    button.addTarget(self, action: #selector(pressBackButton(button:)), for: .touchUpInside)
    button.setImage(image, for: .normal)

    return button
()

func pressBackButton(button: UIButton) 
print("test")
    if let playVideoButtonURL = post?.videourl 

        let player = AVPlayer(url: playVideoButtonURL as URL)
        let playerLayer = AVPlayerLayer(player:player)
        playerLayer.frame = CGRect(x: 100, y: 200, width: 100, height: 100)
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.layer.addSublayer(playerLayer)
        player.play()

    


即使视频代码错误,它仍然应该打印测试,但它没有,这很奇怪。我觉得选择器可能有问题,但我目前不知道它可能有什么问题。

【问题讨论】:

在 self 初始化之前不能访问 self 的属性(函数)。这意味着您无法从属性初始化程序块访问pressBackButton 你知道我将如何解决它吗?我对 swift 是半新的。我尝试将功能放在按钮上方,但它仍然没有在控制台中显示任何内容。 【参考方案1】:

在初始化器之外访问 self 中的函数或属性。

class TestViewController: UIViewController 
    let playButton: UIButton = 
        let button = UIButton()
        let image = UIImage(named: "VideoIcon.png") as UIImage?
        button.backgroundImage(for: .normal)
        button.setImage(image, for: .normal)

        return button
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        button.addTarget(self, action: #selector(pressBackButton(button:)), for: .touchUpInside)
    

【讨论】:

所以我试过了,但是如果我将播放按钮移到那里,我会使用未解析的标识符 pressbackbutton,因为它在 videofeedcell 类中,它是一个 uicollectionviewcell,它需要在那里工作。 @Tim 您的意思是playButtonVideoFeedCelll 中,并且您想在按下按钮时调用UIViewController 中的方法?如果是这样,您需要在配置单元格时添加目标,例如cellForItem【参考方案2】:

而不是做:

let playButton: UIButton = 

    ...
    ...
    return button
()

这不起作用(因为您试图在错误的时间创建 playButton - 这是在视图加载之前或即将出现之前)

在您的viewDidLoadviewWillAppear 中,创建按钮,定义目标并简单地将其添加为子视图。

override func viewDidLoad() 
  super.viewDidLoad()

  let button = UIButton()
  if let image = UIImage(named: "VideoIcon.png") as UIImage?        
  
     button.backgroundImage(for: .normal)
     button.addTarget(self, action: #selector(pressBackButton(button:)), for: .touchUpInside)
     button.setImage(image, for: .normal)
  
  self.addSubview(button)

将按钮添加为子视图increments the retain count(即它不会消失),但如果您想将其作为属性保留,只需将其声明为:

var playButton : UIButton?

然后在viewDidLoad的末尾设置playButton = button

【讨论】:

以上是关于为啥 Swift 3 不能识别我的按钮点击?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像

为啥我的电脑按ctrl+shift不能切换输入法

斯威夫特:为啥点击手势识别器不是每次都有效?

为啥我不能从我的 UICollectionView 中删除图像?

为啥我的编译器指令定义无法识别? (迅速)

为啥我的按钮点击执行多次?