Как добавить представления при использовании функции в отдельном классе в Swift? - PullRequest
0 голосов
/ 27 сентября 2018

Я создал новый Swift-file с классом, который содержит функцию, которая должна добавить некоторые UILabels, UITextFields и UIButton к 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 голосов
/ 30 сентября 2018

Я обнаружил, что я делаю неправильно: я поместил объявление функции в viewdidload, и из-за этого оно не было доступно в других частях контроллера представления.Из-за этого я хотел поместить его в отдельный класс или расширение, но теперь я понял, что решение состоит в том, чтобы поместить объявление функции сразу после объявления класса контроллера представления.

0 голосов
/ 27 сентября 2018

Изменить

class InitialiseLabels

На

extension ViewController

Даже если это находится в другом файле, он должен быть частью исходного класса ViewController, а не какого-либо другого класса.

0 голосов
/ 27 сентября 2018

Создайте класс 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) /

        ...
    }
}
0 голосов
/ 27 сентября 2018

Краткий ответ на ваш вопрос "Как добавить представления при использовании функции в отдельном классе в Swift?"is «Не делай этого».

Вы должны рассматривать представления контроллера представления как частные.Контроллер представления должен отвечать за них.

Если вы действительно хотите, чтобы внешний объект добавил представления к вашему контроллеру представления (опять же, вы не должны этого делать), вам понадобится ссылка на другое представление.контроллер.Было бы понятнее создать функцию, которая будет принимать новые представления в качестве параметров и добавлять их для вызывающей стороны:

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
0 голосов
/ 27 сентября 2018

Может быть, создать синглтон файла 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...