如何在 Swift 中的单独类中使用函数时添加视图?



我创建了一个新Swift-file,其中包含一个函数,该函数应该为viewcontroller添加一些UILabelsUITextFieldsUIButton。 当这段代码在ViewController中时,它可以工作,但在单独的文件中,我收到一些错误消息:

class InitialiseLabels {
func setupLabels() {
// multiple variables are declared without problems, but then:
let viewWidth = view.frame.width // Use of unresolved identifier 'view'
let viewHeight = view.frame.height // Use of unresolved identifier 'view'
view.addSubview(myLabel) // Use of unresolved identifier 'view'
// etcetera
myTextField.delegate = self as" UITextFieldDelegate // Use of unresolved identifier 'self'
view.addSubview(myTextField) // Use of unresolved identifier 'view'
}
}

我想我应该在视图前面添加一些东西来指定它应该去哪里(比如self.view但那个显然不起作用,这个ViewController的名称也不起作用(。有人可以帮我吗?

对于您的问题"如何在 Swift 中使用单独类中的函数时添加视图?"的简短回答是"不要这样做"。

应将视图控制器的视图视为私有视图。视图控制器应该对它们负责。

如果你真的想让外部对象向视图控制器添加视图(同样,你不应该这样做(,你需要一个对另一个视图控制器的引用。创建一个函数会更干净,该函数将新视图作为参数并为调用方添加它们:

public func addViewdToContent(_ views: [UIView]) 

然后,从另一个对象中,您需要对该视图控制器的引用:

let otherViewConroller = //code to somehow get the other view controller. 
let contentView = otherViewConroller.view
let viewWidth = contentView.frame.width
let viewHeight = view.frame.height
otherViewConroller.addViewToContent([myLabel]

你的下一行没有意义,你得到的错误也没有意义。让其他对象成为视图控制器视图的委托是一个非常糟糕的主意。将需要委托的文本字段等视图注入另一个视图控制器也是一个坏主意。

myTextField.delegate = self as" UITextFieldDelegate // makes no sense

更改

class InitialiseLabels

extension ViewController

即使这在另一个文件中,它也必须是原始 ViewController 类的一部分,而不是其他类。

创建一个类MyView并将其分配给 VC 的主视图。并将您的代码放入该类中。

class MyView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override func layoutSubviews() {
super.layoutSubviews()
// add code to align view properly
}
private setup() {
....
let viewWidth = frame.width // Use of unresolved identifier 'view'
let viewHeight = frame.height // Use of unresolved identifier 'view'
addSubview(myLabel)
myTextField.delegate = self as" UITextFieldDelegate // Use of unresolved identifier 'self'
addSubview(myTextField) /
...
}
}

也许创建一个 swift 文件的单例,然后在调用将 UILabel、UIButton 等添加到当前视图控制器的函数时引用单例

假设下面是 swift 文件

class ButtonCreator : NSObject {
//Declare the Singleton
static let shared = buttonCreator()
func thisFunctionCreatesandReturnAButton(withFrame: CGRect) -> UIButton {
let button = UIButton(frame: withFrame)
return button 
}
}

现在,您可以在整个应用程序(任何视图控制器(中将其引用为

self.view.addSubview(ButtonCreator.shared.thisFunctionCreatesandReturnAButton(withFrame:CGRect(0,0,100,44)))

我发现我做错了什么:我将函数的声明放在 viewdidload 中,因此它在视图控制器的其他部分中不可用。正因为如此,我想把它放在一个单独的类或扩展中,但现在我意识到解决方案是将函数声明放在视图控制器类声明之后。

最新更新