错误表明编译器无法确定应该调用哪个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' 缺少参数”可能是代码中其他问题的结果。但是,如果您修复按钮的声明,您可能能够更好地诊断代码中可能存在的任何其他问题。