自定义UIButton子类不显示标题

时间:2014-11-11 05:15:22

标签: ios swift uibutton subclass

首先我要说的是,我知道这是一个经常被问到的问题,我似乎无法找到与我一样的情景/问题的人。

我正在写一个音乐应用程序,我想出了一个我喜欢的用户界面。它需要一个具有特殊功能的按钮(过去可以通过自定义按钮类型实现),所以我决定创建一个UIButton子类。我在我的子类中使用了以下代码:

required init(coder aDecoder: NSCoder) {
    self.activeState = false
    self.activeAccidental = UIImageView()
    super.init(coder: aDecoder)
    self.layer.borderColor = UIColor(white:221/255, alpha: 1.0).CGColor
    self.layer.borderWidth = 2.0
    self.backgroundColor = UIColor.blackColor()
    self.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    self.setTitle("Hello", forState: .Normal)
}

override func layoutSubviews() {
    println(self.frame.origin.x)
    self.activeAccidental = UIImageView(frame: CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 20, 20))
    self.activeAccidental.image = UIImage(named: "BMICalcIcon.png")
    self.addSubview(activeAccidental)
}

但是,当我向故事板添加一个按钮(并在字段中输入自定义类名称)时,无论是在显示的初始值设置中还是在故事板中的属性检查器中设置,我的标题都不可见。这是我在swift中的第一个重大项目,所以我不确定问题是什么。

ImageView移至initWithCoder

时的代码
required init(coder aDecoder: NSCoder) {
    self.activeState = false
    self.activeAccidental = UIImageView()
    super.init(coder: aDecoder)
    self.activeAccidental = UIImageView(frame: CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 20, 20))
    self.activeAccidental.image = UIImage(named: "BMICalcIcon.png")
    self.layer.borderColor = UIColor(white:221/255, alpha: 1.0).CGColor
    self.layer.borderWidth = 2.0
    self.backgroundColor = UIColor.blackColor()
    self.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    self.setTitle("Hello", forState: .Normal)
    self.addSubview(activeAccidental)
}

3 个答案:

答案 0 :(得分:9)

也许添加[super layoutSubviews]; 我有同样的问题,因为我忘了添加这条线。之后,您可以添加所需的代码。

答案 1 :(得分:1)

我不确定原因,但问题是在layoutSubviews中添加用于添加图片视图的代码 - 无论如何都不是一个好地方,因为它可以被多次调用,这将导致您要添加多个图像视图。如果将该代码移动到initWithCoder方法中,它将正常工作。这是我制作的测试课程,

import UIKit

class RDButton: UIButton {

    var activeState: Bool
    var activeAccidental: UIImageView

    required init(coder aDecoder: NSCoder) {
        self.activeState = false
        self.activeAccidental = UIImageView()
        super.init(coder: aDecoder)
        self.activeAccidental = UIImageView(frame: CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 20, 20))
        self.activeAccidental.image = UIImage(named: "img.jpg")
        self.layer.borderColor = UIColor(white:221/255, alpha: 1.0).CGColor
        self.layer.borderWidth = 2.0
        self.backgroundColor = UIColor.blackColor()
        self.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        self.setTitle("Hello", forState: .Normal)
        self.addSubview(activeAccidental)

    }
}

答案 2 :(得分:0)

当当前视图控制器(包含自定义按钮)使用performSegue(withIdentifier:sender:)从主队列以外的队列启动时,也会发生这种情况。要解决此问题,只需在主线程中调用该方法即可。例如:

class MyViewController: ViewController {
    ...
    func doTask() {
        let myTask = MyTask()
        myTask.perform( {
            Dispatch.main.async {
                self.performSegue(withIdentifier: "second", sender: nil)
            }
        })
    }
}