在调用 Swift 中缺少参数“编码器”的参数

Posted

技术标签:

【中文标题】在调用 Swift 中缺少参数“编码器”的参数【英文标题】:missing argument for parameter 'coder' in call Swift 【发布时间】:2016-08-13 21:37:52 【问题描述】:

在我得到的代码中:

在调用 swift 时缺少参数 'coder' 的参数

我是 Swift 的初学者,我已经尝试了所有方法,包括研究这个问题,但没有找到答案。谢谢。

我收到此错误的代码是:

let button: UIButton = UIButton(frame: CGRect(origin: CGPoint(x: ChecklistViewController().view.frame.width / 2 + 117, y: ChecklistViewController().view.frame.size.height - 70), size: CGSize(width: 50, height: 50)))

【问题讨论】:

您应该编辑问题以共享产生此错误的代码行。 好的,我更新了问题。 【参考方案1】:

错误表明编译器无法确定应该调用哪个init 方法,因此假设您打算调用init(coder:)

但让我们先把它放在一边。首先,让我们简化您的陈述以消除一些“噪音”。您可以使用CGRect(x:, y:, width:, height:),而不是使用CGRect(origin:, size:)。这将产生(将其分开以使其更易于阅读):

let button = UIButton(frame: CGRect(
    x: ChecklistViewController().view.frame.width / 2 + 117,
    y: ChecklistViewController().view.frame.size.height - 70,
    width: 50,
    height: 50)
)

其次,这里的问题是ChecklistViewController() 语法实际上并没有引用您现有的ChecklistViewController。每次看到ChecklistViewController() 时,它都会创建该视图控制器的一个新实例(因此您可能有三个实例,一个是原始实例,另一个是您在此处意外创建的)。这当然不是你想要的。如果您在视图控制器本身的实例方法之一中执行此操作,您只需引用 self,例如:

let button = UIButton(frame: CGRect(
    x: self.view.frame.width / 2 + 117,
    y: self.view.frame.size.height - 70,
    width: 50,
    height: 50)
)

一个更微妙的问题是,该代码只有在设置了viewframe 时才有效。但是如果您在viewDidLoad 中有此代码,则frame 尚未设置。但是,如果您在 viewDidAppear 中执行此操作,则可以摆脱此代码。通常,您会使用自动布局来避免这种情况,例如类似:

let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
// do additional configuration of the button here

view.addSubview(button)

NSLayoutConstraint.activateConstraints([
    button.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor, constant: 117),
    button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor, constant: -70),
    button.widthAnchor.constraintEqualToConstant(50),
    button.heightAnchor.constraintEqualToConstant(50)
])

因为我们使用自动布局进行了此操作,这意味着您可以根据需要在viewDidLoad 中进行此操作。此外,这意味着如果您旋转设备,约束将自动为您重新计算frame

说了这么多,“参数 'coder' 缺少参数”可能是代码中其他问题的结果。但是,如果您修复按钮的声明,您可能能够更好地诊断代码中可能存在的任何其他问题。

【讨论】:

感谢您的帮助,但是当我在代码中使用“self”而不是 ChecklistViewController() 时,出现了另一个错误。这个错误说:'NSObject -> () -> ChecklistViewController'类型的值没有'view'的成员 如果您是从视图控制器的实例方法中执行此操作,您只会使用self。这听起来不像是你在做这件事,但如果没有更多的上下文,我们无能为力。即,你在哪里有你的问题的代码?但最重要的是,不要使用CheckViewController() 语法,而是获取对现有实例的引用。【参考方案2】:

我认为问题在于您使用 ChecklistViewController 来生成您的职位。 试试这个代码

let button: UIButton = UIButton(frame: CGRect(x: (CGRectGetMidX(self.view.frame) + 117) , y: (CGRectGetMaxY(self.view.frame) - 70) , size: CGSize(width: 50, height: 50)))

【讨论】:

当我尝试时出现错误提示:'NSObject -> () -> ChecklistViewController' 类型的值没有成员'view' 你是在 viewController 中做这个吗?它需要位于一个类中。

以上是关于在调用 Swift 中缺少参数“编码器”的参数的主要内容,如果未能解决你的问题,请参考以下文章

“找不到存储在数据集中的类型的编码器”和“方法映射的参数不足”?

调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?

使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)

Swift 中的 PFUser logInWithUsernameInBackground - 参数“目标”调用缺少参数

Swift 中缺少参数错误的参数

在 CGRectIntersectsRect 中的调用错误中缺少参数 #2