- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在一个项目中遇到了一个非常奇怪的问题。 XCode 一直给我红色错误,并说我的 IBDesignables 有问题。但是错误消息每次都不同,而且总是受到影响的另一个 View Controller 。我不知道如何找到问题的原因。我创建的所有 IBDesignables 似乎都是随机发生的。
该应用程序仍然有效。虽然,有时它无法正确呈现某些 View (我有带有自定义绘制 mask 的 View )。它很少发生,但确实发生了。
这些是我得到的错误:
"Failed to update the auto layout status: The agent crashed"
"Failed to render and update the auto layout status for {randomly chosen VC name}: The agent crashed"
后者在我点击后立即消失。有时,当我进入 Storyboard时,所有的错误都会消失。当我打开任何其他文件时,我会收到多个红色错误(有时是 3 个,有时是 6 个或更多)。
我检查了崩溃日志。他们每个人都说:
fatal error: unexpectedly found nil while unwrapping an Optional value
我不确定这是什么意思。
我尝试清理项目并重新启动 XCode。此外,我还实现了所有 init
方法。
下面的代码是一个类
,它(几乎)总是我得到的错误的一部分。此外,自定义绘制的 View 有时无法正确呈现:
import UIKit
struct TriangleViewLabelDefault {
static let triangleWidth: CGFloat = 20
static let triangleHeight: CGFloat = 10
}
@IBDesignable
class TriangleView: UIView {
let DEFAULT_TRIANGLE_WIDTH: CGFloat = 30
let DEFAULT_TRIAGNLE_HEIGHT: CGFloat = 20
struct Triangle {
static var width: CGFloat = TriangleViewLabelDefault.triangleWidth
static var height: CGFloat = TriangleViewLabelDefault.triangleHeight
static var midXPosition: CGFloat = 0
}
@IBInspectable var triangleWidth: CGFloat = TriangleViewLabelDefault.triangleWidth {
didSet {
Triangle.width = triangleWidth
}
}
@IBInspectable var triangleHeight: CGFloat = TriangleViewLabelDefault.triangleHeight {
didSet {
Triangle.height = triangleHeight
}
}
@IBInspectable var relativePosition: Bool = true {
didSet {
setNeedsDisplay()
}
}
@IBInspectable var triangleMidXOffset: CGFloat = 0 {
didSet {
setNeedsDisplay()
}
}
@IBInspectable var decoration: Bool = true {
didSet {
setNeedsDisplay()
}
}
@IBInspectable var lines: Int = 20 {
didSet {
setNeedsDisplay()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func draw(_ rect: CGRect) {
super.draw(rect)
calcTriangleMidXPosition()
addLines()
if decoration {
addDecoration()
}
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
let maskPath = UIBezierPath()
maskPath.move(to: CGPoint(x: 0, y: Triangle.height))
/* Triangle */
maskPath.addLine(to: CGPoint(x: Triangle.midXPosition - Triangle.width, y: Triangle.height))
maskPath.addLine(to: CGPoint(x: Triangle.midXPosition, y: 0))
maskPath.addLine(to: CGPoint(x: Triangle.midXPosition + Triangle.width, y: Triangle.height))
/* */
maskPath.addLine(to: CGPoint(x: bounds.size.width, y: Triangle.height))
maskPath.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height))
maskPath.addLine(to: CGPoint(x: 0, y: bounds.size.height))
maskPath.addLine(to: CGPoint(x: 0, y: Triangle.height))
maskPath.close()
maskLayer.path = maskPath.cgPath
layer.mask = maskLayer
}
/// Evaluates the properties set in storyboard. This methods calculates the x-center of the triangle
private func calcTriangleMidXPosition() {
if relativePosition {
Triangle.midXPosition = bounds.size.width / 2 + triangleMidXOffset * bounds.size.width / 2
} else {
Triangle.midXPosition = bounds.size.width / 2 + triangleMidXOffset
}
}
private func addDecoration() {
if let superview = superview {
let topLine = UIView(frame: CGRect(x: 0, y: frame.minY + Triangle.height - 2, width: bounds.size.width, height: 1))
let bottomLine = UIView(frame: CGRect(x: 0, y: frame.minY + Triangle.height - 4, width: bounds.size.width, height: 1))
topLine.backgroundColor = UIColor.white
bottomLine.backgroundColor = UIColor.white
topLine.alpha = 0.5
bottomLine.alpha = 0.2
superview.insertSubview(topLine, belowSubview: self)
superview.insertSubview(bottomLine, belowSubview: self)
}
}
private func addLines() {
guard lines > 0 else {
return
}
let paddingLeft: Int = 20
let lineLength: Int = 25
let linesLayer = CAShapeLayer()
linesLayer.frame = bounds
let padding: CGFloat = 20
let minY = Triangle.height + padding
let maxY = bounds.height - padding
let yArea = maxY - minY
for x in 0...lines {
let path = UIBezierPath()
path.lineWidth = 3.0
path.move(to: CGPoint(x: CGFloat(paddingLeft), y: minY + CGFloat(x) * yArea / CGFloat(lines)))
path.addLine(to: CGPoint(x: CGFloat(paddingLeft) + CGFloat(lineLength), y: minY + CGFloat(x) * yArea / CGFloat(lines)))
UIColor(red: 200.0/255.0, green: 200.0/255.0, blue: 200.0/255.0, alpha: 1.0).setStroke()
path.stroke()
}
}
}
谢谢大家的帮助!
最佳答案
每次出现此“代理崩溃”问题时,都会创建一个崩溃日志。您可以在这里找到所有这些:
~/Library/Logs/DiagnosticReports
命名为 IBDesignablesAgentCocoaTouch_*.crash
只需进入 Finder(转到 -> 转到文件夹),复制路径并替换为您的用户名。
可能你那里有太多崩溃日志,你可以将它们全部删除,清理你的项目,重新构建并检查文件夹。
关于ios - @IBDesignables - "the agent crashed"但应用程序仍然有效(大部分时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39942159/
我正在尝试实现一个简单的UIButton子类,它是IBDesignable。我希望能够从Interface Builder为控件的每个状态设置颜色。我知道这可以通过IBInspectable关键字实现
我希望能够在代码中布局我的 View Controller ,但可以看到界面构建器中显示的布局。 我知道我可以创建一个 UIView 子类,使其 IBDesignable,并将其分配给 View Co
我正在尝试在我的 IOS 项目中创建一个自定义按钮。但是,当我使用我的类创建按钮时,背景在 Storyboard中不起作用。但是当我运行该程序时,按钮工作正常。 在这里你可以看到我的类(class)
我在使用 XCode 时遇到了一个非常具体的问题。 设置 目标中同名的颜色不同 我的 XCode 项目中有两个目标,目标 A 和 目标 B。 它们都有一个名为 Colors.xcassets 的单独资
我正在使用 Xcode 的本地化导出功能,并且我有一个带有 IBInspectable 字符串的自定义 IBDesignable UIControl。我想知道是否有办法将此字符串包含到导出的 .xli
我使用此视频 (https://www.youtube.com/watch?v=xGdRCUrSu94&t=2502s) 创建了自定义分段控件。我希望能够在运行时将自定义分段控件 (commaSepe
我有一个 IBDesignable 类。 @IBDesignable class Foobar: UIView { // ignore all init code var foo: C
我创建了一个具有自定义 IBDesignable UIView 的框架。当我在项目中只包含框架时,IBInspectable 属性不会显示在属性检查器中,但我可以以编程方式使用 View 属性。 我检
我正在使用 swift 构建一个新的 iOS 应用程序,并尝试制作一个自定义的 IBDesignable UIButton 类以在设计器中使用。我的代码在运行时似乎在构建器或应用程序本身中都不起作用。
我正在尝试使用我导入到项目中的一些 IB 可设计对象,这些可设计对象可通过 Storyboard访问,但在使用时不执行任何操作。我注意到一个 Designables - Build Failed 在右
我是 Xcode 的新手,我认为有办法做到这一点,但我似乎无法弄清楚。 我通过子类化 UIView 并使用 IBDesignable 制作了一个自定义控件。 但是,我似乎无法弄清楚如何将事件从我的控制
我已经创建了 IBDesignable 和 IBInspectable 自定义类来为 View 提供阴影和角半径 但是当我将 Designable 类分配给 view 时,我得到 Designable
当我编写自己的 UIButton 扩展类并使其成为 @IBDesignable 时,我在 Interface Builder 中收到两个错误,即: Main.storyboard: error: IB
我最近对 Assets.xcassets 做了一些更改这对 XCode 造成了绝对的困惑。我最终遇到了多个此类错误:Failed to render and update auto layout
我已经在 OS X 应用程序中实现了一个运行良好的自定义控件。当绘制控件时,它使用来自非系统框架的代码。控件是用swift编写的,框架是用Objective-C编写的。该框架不是与具有自定义控件的应用
我有一个 xib ( childXib ) 文件链接到其自定义 UIView swift 文件通过其所有者。 这就是我如何初始化我的自定义 UIView : // init for IBDesigna
我正在尝试在我的 Objective-C 项目中使用我在 github 上找到的一个 swift 库。我已按照此处的说明进行操作:How to call Objective-C code from S
我不明白为什么在尝试实现@IBDesignable时 socket 为零。该应用程序不断崩溃。 import UIKit import RxSwift import RxCocoa @IBDesign
我有一个 @IBDesignable 自定义 View 。它包含一个带有两个子类 UILabels 的 UIView。 UILabel 的自定义子类正在设置它的字体。 我想要实现的目标是通过将 Vie
我正在尝试创建自定义 UITextField 并设置自定义边框颜色。我也为 borderColor 创建了一个 IBInspectable 属性,如果我使用它的 set 和 get 方法,我可以使用
我是一名优秀的程序员,十分优秀!