Кнопки программно на Swift 4

Быстрый вопрос, я пытаюсь создать функцию с именем setupHeader(), в которой при вызове настраиваются все виды и кнопки заголовка. Проблема с кнопкой "Выйти", по какой-то причине я не могу сделать это правильно.

Первая ошибка заключается в том, что addTarget кнопки не распознает "себя". Какие-либо предложения?

Второй - то, что #selector работает только с функцией @objc, и функция не может быть в основной функции setupHeader. Где я должен положить это? вот фрагмент моего кода:

import Foundation
import UIKit

func setupHeader(vc: UIViewController) {

let headerFiller: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = supaGray
    return view
}()

let header: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = supaGray
    return view
}()

let logOutButton: UIButton = {
    let button = UIButton()
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setTitle("Log Out", for: .normal)
    button.setTitleColor(.blue, for: .normal)
    button.titleLabel?.adjustsFontSizeToFitWidth = true
    button.titleLabel?.textAlignment = .left
    button.addTarget(self, action: #selector(handleLogOutButton), for: .touchUpInside)
    return button
}()

func handleLogOutButton() {

}

vc.view.addSubview(header)
header.topAnchor.constraint(equalTo: vc.view.safeAreaLayoutGuide.topAnchor).isActive = true
header.leftAnchor.constraint(equalTo: vc.view.leftAnchor).isActive = true
header.rightAnchor.constraint(equalTo: vc.view.rightAnchor).isActive = true
header.heightAnchor.constraint(equalToConstant: 40).isActive = true

header.addSubview(logOutButton)
logOutButton.centerYAnchor.constraint(equalTo: header.centerYAnchor, constant: -5).isActive = true
logOutButton.leftAnchor.constraint(equalTo: header.leftAnchor, constant: 7).isActive = true
logOutButton.widthAnchor.constraint(equalTo: header.widthAnchor, multiplier: 0.17).isActive = true
logOutButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

vc.view.addSubview(headerFiller)
headerFiller.topAnchor.constraint(equalTo: vc.view.topAnchor).isActive = true
headerFiller.leftAnchor.constraint(equalTo: vc.view.leftAnchor).isActive = true
headerFiller.rightAnchor.constraint(equalTo: vc.view.rightAnchor).isActive = true
headerFiller.bottomAnchor.constraint(equalTo: header.topAnchor).isActive = true
}

3 ответа

Решение

Объявите свою кнопку, нажмите обратный вызов таким образом.

@objc func handleLogOutButton() {

}

А для самостоятельной ошибки используйте vc в качестве аргумента выше в функции.

Довольно прямо:

Измените ваш код, как показано ниже:

lazy var logOutButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Log Out", for: .normal)
button.setTitleColor(.blue, for: .normal)
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.textAlignment = .left
button.addTarget(self, action: #selector(handleLogOutButton), for: .touchUpInside)
return button

} ()

@objc func handleLogOutButton() {
// Do your things here
}

Похоже, вы передаете контроллер представления в свою функцию, поэтому использование self не сработает. Попробуйте использовать "VC"

Другие вопросы по тегам