将目标添加到 UIButton 以进行超级视图

Posted

技术标签:

【中文标题】将目标添加到 UIButton 以进行超级视图【英文标题】:Adding target to UIButton for superview 【发布时间】:2015-10-16 15:04:37 【问题描述】:

我正在以编程方式将UIView 添加到SKScene。在这个UIView 中,我有一个按钮可以触发SKScene 中的命令。我该怎么做呢?我的代码抛出异常。或者这只是不干净的编程?

class LevelAchievedView: UIView 

override init(frame: CGRect) 
        super.init(frame: frame)
        self.opaque = false
    
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    override func drawRect(rect: CGRect) 
        let replayButton = UIButton()
        replayButton.setTitle("Replay?", forState: UIControlState.Normal)
        replayButton.setTitleColor(UIColor.greenColor(), forState: UIControlState.Normal)
        replayButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 30)
        replayButton.addTarget(self.superview, action: "returnToStart", forControlEvents: .TouchUpInside)
        replayButton.frame.origin = CGPointMake(10, 10)
        self.addSubview(replayButton)
    

看来我搞砸了replayButton.addTarget(self.superview...,我想我不能在这种情况下使用self.superview,尽管我在SKScene 中有func returnToStart()。我错过了什么?

抛出的异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SKView returnToStart]: unrecognized selector sent to instance 0x7ff10980fc00'

【问题讨论】:

我认为你在SKScene 类中创建了returnToStart。但是self.superview 不是SKScene,仅仅是因为SKScene 不是UIView 的子类。您的代码尝试在didMoveToView(view: UIView) 收到的UIView 上执行returnToStart。也不是returnToStart != returnToStart: 是的,我在我的 SKScene 类中创建了 returnToStart。我可以从 UIView 访问 SKScene 功能吗? 我发布了一个解决方案。 【参考方案1】:

self.superview 不是SKScene。只是一个解决方案:

class LevelAchievedView: UIView 
    let replayButton: UIButton

    override init(frame: CGRect) 
        self.replayButton = UIButton()

        super.init(frame: frame)
        self.opaque = false

        replayButton.setTitle("Replay?", forState: UIControlState.Normal)
        replayButton.setTitleColor(UIColor.greenColor(), forState: UIControlState.Normal)
        replayButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 30)
        replayButton.frame.origin = CGPointMake(10, 10)
        self.addSubview(replayButton)
    


class MyScene: SKScene 
    override func didMoveToView(view: SKView) 
        // ...
        let levelAchieved = LevelAchievedView(rect: CGRect(...))
        levelAchieved.replayButton.addTarget(self, action: "returnToStart", forControlEvents: .TouchUpInside)
        view.addSubview(levelAchieved)
    

    func returnToStart() 
        // your code here
    

【讨论】:

当我使用此代码时,我收到消息:Property 'self.replayButton' not initialized at super.init call. 我更新了我的代码。但我认为你能够解决这个问题。请不要只复制粘贴... 我将第二行更改为 'let replayButton = UIButton()' 并删除了 'self.replayButton = UIButton'。现在完美运行,感谢一百万!【参考方案2】:

你需要实现returnToStart。尝试添加如下内容:

function returnToStart() 
    println("returning to start");

到你的LevelAchevedView 班级

【讨论】:

当我这样做时,我无法更改包含 UIView LevelAchievedView 类的 SKView。所以它对我不起作用。

以上是关于将目标添加到 UIButton 以进行超级视图的主要内容,如果未能解决你的问题,请参考以下文章

添加 UIButton 目标时“类名没有成员函数名”

检测 UIButton 触摸子视图

Swift - 将目标添加到子视图内的 UIButton

以编程方式将 UIButton 添加到 UINavigationBar 的子视图,并且触摸事件未注册

向 UIButton 添加插座

以编程方式将 UIButton 添加到 UITableView 但按钮不显示