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

时间:2018-09-27 12:08:13

标签: ios swift viewcontroller

我创建了一个新的Swift-file,其类包含一个函数,该函数应向UILabels添加一些UITextFieldsUIButton和一个viewcontroller。 当此代码在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的名称也无效)。有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

您的问题的简短答案“如何在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

答案 1 :(得分:0)

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

假设下面是快速文件

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)))

答案 2 :(得分:0)

创建一个类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) /

        ...
    }
}

答案 3 :(得分:0)

更改

class InitialiseLabels

收件人

extension ViewController

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

答案 4 :(得分:0)

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