Проблема в том, что, поскольку вы не сохраняете MakerClass
, цель для кнопки установлена на NSNull()
. Это можно увидеть, добавив…
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let buttons = view.subviews as! [UIButton]
for button in buttons {
print(button)
print("Target :", button.allTargets.first!)
}
}
<UIButton: 0x7ff89fd04110; frame = (0 0; 100 100); opaque = NO; layer = <CALayer: 0x60000257bac0>>
Target : <TestProgrammaticButton.ViewController: 0x7ff89ff08050>
<UIButton: 0x7ff89fd05020; frame = (0 200; 100 100); opaque = NO; layer = <CALayer: 0x60000257bb40>>
Target : <null>
Если вы хотите, чтобы кнопка запускала метод действия в вашем контроллере вида, вы можете сделать ...
class MakerClass {
init(intoView: UIView, with viewController: ViewController) {
// configure
backgroundButton.addTarget(viewController, action: #selector(iwastouched(_:)), for: .touchUpInside)
}
}
Но это связывает ваш MakerClass
с этим конкретным ViewController
class.
Вместо этого MakerClass
может вернуть отформатированную кнопку и затем установить цель / действие в контроллере представления.
Обновление
Согласно комментарию @ RakeshaShastri ниже, так как цель установлена на NSNull()
, приложение будет идти вверх по цепочке респондента в поисках UIResponder
(обычно UIView
или UIViewController
) с правильной сигнатурой функции.Цепочка респондента в вашем случае:…
backgroundButton
-> ViewController.view
-> ViewController
-> UIWindow
Вы можете проверить это, добавив
@objc func iwastouched(_ sender: UIButton!) {
print("touched")
}
к вашему ViewController
классу.