在调用 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)
)
一个更微妙的问题是,该代码只有在设置了view
的frame
时才有效。但是如果您在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 - 参数“目标”调用缺少参数