25

从第一个 XCode 6/iOS 8 beta 版本开始,我一直在断断续续地开发一个应用程序几个月。我最喜欢添加的功能之一是实时渲染,这可以通过@IBDesignableSwift 中的标签实现。

我还没有得到任何东西来实时渲染。我想这一定是因为它是一个测试版,所以我决定等待完整版本出来再试一次。它仍然失败。我当时认为我的代码中可能存在来自 beta 版本的工件,所以我放弃了它并重新开始。它仍然不起作用。当然,这些错误现在更具描述性。

这是我的代码:

import UIKit

@IBDesignable class MyButton : UIButton {

    let UNPRESSED_COLOR = UIColor(red: 221.0/256.0, green: 249.0/256.0, blue: 14.0/256.0, alpha: 1.0)
    let PRESSED_COLOR = UIColor(red: 166.0/256.0, green: 187.0/156.0, blue: 11.0/256.0, alpha: 1.0)
    var buttonColorValue: UIColor

    let TEXT_COLOR = UIColor(red: 72.0/256.0, green: 160.0/256.0, blue: 5.0/256.0, alpha: 1.0)

    required init(coder: NSCoder) {
        self.buttonColorValue = UNPRESSED_COLOR
        super.init(coder: coder)
        // Initialization code
        self.setTitleColor(TEXT_COLOR, forState: UIControlState.Normal)
        self.setTitleColor(TEXT_COLOR, forState: UIControlState.Highlighted)
        self.setTitleColor(TEXT_COLOR, forState: UIControlState.Selected)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        buttonColorValue = PRESSED_COLOR
        self.setNeedsDisplay()
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        super.touchesEnded(touches, withEvent: event)
        buttonColorValue = UNPRESSED_COLOR
        self.setNeedsDisplay()
    }

    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
        super.touchesCancelled(touches, withEvent: event)
        buttonColorValue = UNPRESSED_COLOR
        self.setNeedsDisplay()
    }

    override func drawRect(rect: CGRect) {
        buttonColorValue.setFill()
        let ctx = UIGraphicsGetCurrentContext()
        CGContextFillRect(ctx, rect)
        //UIBezierPath(roundedRect: rect, cornerRadius: 5.0).fill()
    }
}

以下是我尝试在情节提要中使用这些按钮之一进行构建时遇到的错误:

IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed

IB Designables: Failed to render instance of MyButton: Rendering the view took longer than 200 ms. Your drawing code may suffer from slow performance.

正如您在我的代码中看到的那样,我最初希望这个按钮是圆形的。我想这可能是这个问题的原因,尽管令我惊讶的是,Apple 会设计一个低效的圆角矩形绘图算法。我切换到简单地设置颜色并按原样绘制矩形。还是有问题。

我认为(无论如何我希望)我做错了一件小事,因为我已经用谷歌搜索了,似乎没有其他人有这个问题。似乎它可能是某种无限循环?

这不是我必须继续做的事情,但是让实时渲染工作将使开发对我来说更快、更容易,因为我将能够看到我的接口并对其进行测试,而无需运行它们。

提前感谢任何对如何解决这个问题有远程线索的人。

4

5 回答 5

49

显然我需要init(frame: CGRect)init(code: NSCoder).

得到它的工作!如果有人愿意解释为什么这不起作用,那就太好了。否则,我在这里很好。

于 2014-11-06T06:19:46.340 回答
6

虽然这可能不是一个真正有用的答案,但我发现在寻找解决方案半小时后,简单地关闭并重新打开 Xcode 就可以解决问题 - 如果你还没有尝试过,那就试试吧!

于 2015-03-22T23:43:36.247 回答
3

确保覆盖 prepareForInterfaceBuilder 来解决这个问题。

@IBDesignable
class SomeView: UITableView {
 @IBInspectable var something: Int? { didSet { setup() } }

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

override init(frame: CGRect, style: UITableViewStyle) {
    super.init(frame: frame, style: style)
    setup()
}

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    setup()
}

func setup() {
    // do sth
}
}
于 2016-05-12T13:26:35.320 回答
1

有同样的问题,但看一眼这篇很棒的文章。它解决了我的问题。

http://nshipster.com/ibinspectable-ibdesignable/

简而言之

在 xcode 中获取这些选项

在此处输入图像描述

制作这样的属性:

@IBInspectable var cornerRadius: CGFloat = 0 {
   didSet {
       layer.cornerRadius = cornerRadius
       layer.masksToBounds = cornerRadius > 0
   }
}
于 2015-08-10T20:45:11.983 回答
0

对我来说,这个错误原来是由于在我的 @IBInspectable 属性之一中对 sqlite 数据库(使用 CoreData)的阻塞调用造成的。

我的代码最初是查询数据库,然后用于dispatchAsync根据查询结果设置标签的值。我对其进行了更改,以便查询也在dispatchAsync块中启动。错误立即消失。

如果其他人遇到此错误的问题,我建议检查将在设计阶段执行的任何代码(用@IBInspetable 标记的构造函数或计算属性)。如果有任何阻塞代码(网络操作、数据库访问等),则可能导致超时错误。希望这可以帮助。

于 2015-03-10T22:39:29.290 回答