Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义UIButton子类不显示标题_Ios_Swift_Uibutton_Subclass - Fatal编程技术网

Ios 自定义UIButton子类不显示标题

Ios 自定义UIButton子类不显示标题,ios,swift,uibutton,subclass,Ios,Swift,Uibutton,Subclass,首先,我要说,我知道这是一个常见问题,我只是找不到和我有同样情况/问题的人 我正在写一个音乐应用程序,我想出了一个我喜欢的用户界面。它需要一个具有特殊功能的按钮,超过了自定义按钮类型可以实现的功能,所以我决定创建一个UIButton子类。我在我的子类中使用了以下代码: required init(coder aDecoder: NSCoder) { self.activeState = false self.activeAccidental = UIImageView()

首先,我要说,我知道这是一个常见问题,我只是找不到和我有同样情况/问题的人

我正在写一个音乐应用程序,我想出了一个我喜欢的用户界面。它需要一个具有特殊功能的按钮,超过了自定义按钮类型可以实现的功能,所以我决定创建一个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时的代码


我不知道为什么,但问题是将用于添加图像视图的代码放在LayoutSubview中-无论如何,这不是一个好地方,因为它可以被多次调用,这将导致您添加多个图像视图。如果将该代码移动到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)

    }
}

我不知道为什么,但问题是将用于添加图像视图的代码放在LayoutSubview中-无论如何,这不是一个好地方,因为它可以被多次调用,这将导致您添加多个图像视图。如果将该代码移动到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)

    }
}
可能会添加[超级布局子视图]; 我也有同样的问题,因为我忘了添加这一行。之后,您可以添加所需的代码。

可能会添加[超级布局子视图];
我也有同样的问题,因为我忘了添加这一行。之后,您可以添加所需的代码。

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

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

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

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

图层的背景色和标题均为白色。这可能是问题所在吗?对不起,我一定是把代码复制错了,我现在就修复它。你的图层的背景色和标题都是白色的。这可能是问题所在吗?抱歉,我一定是复制了错误的代码,我现在将修复它。我是否应该在layoutSubviews方法中保留任何代码?我刚刚尝试将代码移动到initWithCoder方法中。“不行!”埃里克马克26,真奇怪,我复制了你的代码,照我说的做了,它对我有效。你看到你的图像了吗?实际上,我之所以把代码放在layoutSubviews方法中,首先是因为self.bounds.origin.x和.y在init方法中都返回0,而在layoutSubviews方法中返回实际值。@ericmark26,self.bounds.origin不是0,0吗?通常是这样。我应该在layoutSubviews方法中保留任何代码吗?我只是尝试将代码移动到initWithCoder方法中。“不行!”埃里克马克26,真奇怪,我复制了你的代码,照我说的做了,它对我有效。你看到你的图像了吗?实际上,我之所以把代码放在layoutSubviews方法中,首先是因为self.bounds.origin.x和.y在init方法中都返回0,而在layoutSubviews方法中返回实际值。@ericmark26,self.bounds.origin不是0,0吗?通常是这样。很好的回答,让我疯狂了半个小时。很好的回答,让我疯狂了半个小时。