简体   繁体   English

如何在子视图中获取按钮以在视图控制器中启用rightbarbuttonitem

[英]How can I get a button in my subview to enable the rightbarbuttonitem in my view controller

I have a UIView with a textfield and a button, this UIView is a subview of my view controller. 我有一个带有文本字段和按钮的UIView,该UIView是视图控制器的子视图。 How can I have the button in my subview enable the view controller's navigation rightbarbuttonitem when it is pressed? 如何在子视图中使按钮按下时启用视图控制器的导航rightbarbuttonitem?

class CreateActivityView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    lazy var addButton: UIButton = {
        let button = UIButton(type: UIButton.ButtonType.system)
        button.setImage(UIImage(named: "add_dark.png"), for: .normal)
        button.frame = CGRect(x: 0, y: 0, width: 24.0, height: 24.0)
        button.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
        button.isEnabled = false
        button.translatesAutoresizingMaskIntoConstraints = false

        return button
    }()

    lazy var activityNameTextField: DataEntryTextField = {
        let textField = DataEntryTextField()
        textField.frame = CGRect(x: 0, y: 0, width: 250.0, height: 30.0)
        textField.placeholder = "Add an activity"
        textField.font = UIFont(name: "Avenir", size: 17)
        textField.keyboardType = UIKeyboardType.default
        textField.returnKeyType = UIReturnKeyType.done
        textField.translatesAutoresizingMaskIntoConstraints = false

        return textField
    }()

    lazy var activityNameLabel: UILabel = {
        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 0, height: 30.0)
        label.font = UIFont(name: "Avenir", size: 17)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.isHidden = true

        return label
    }()

    func setupView() {
        backgroundColor = UIColor.lightGray
        addSubview(addButton)
        addButton.rightAnchor.constraint(equalTo: self.safeAreaLayoutGuide.rightAnchor, constant: -16.0).isActive = true
        addButton.centerYAnchor.constraint(equalTo: self.safeAreaLayoutGuide.centerYAnchor).isActive = true
        addButton.heightAnchor.constraint(equalToConstant: 24.0).isActive = true
        addButton.widthAnchor.constraint(equalToConstant: 24.0).isActive = true

        addSubview(activityNameTextField)
        activityNameTextField.leftAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leftAnchor, constant: 16.0).isActive = true
        activityNameTextField.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 10.0).isActive = true
        activityNameTextField.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: -10.0).isActive = true
        activityNameTextField.rightAnchor.constraint(equalTo: addButton.safeAreaLayoutGuide.leftAnchor, constant: -20.0).isActive = true

        addSubview(activityNameLabel)
        activityNameLabel.leftAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leftAnchor, constant: 16.0).isActive = true
        activityNameLabel.rightAnchor.constraint(equalTo: self.safeAreaLayoutGuide.rightAnchor, constant: -16.0).isActive = true
        activityNameLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 10.0).isActive = true
        activityNameLabel.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: -10.0).isActive = true

    }

    @objc func addButtonTapped() {
        guard let validatedText = activityNameTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines), !validatedText.isEmpty else {
            return
        }

        displayActivityNameLabel(with: validatedText)
    }

    func displayActivityNameLabel(with text: String) {
        activityNameLabel.text = text
        activityNameLabel.isHidden = false
        activityNameTextField.isHidden = true

        print(activityNameLabel.text)
    }

}


class QuickLogViewController: UIViewController {

    let screenSize = UIScreen.main.bounds.size
    var createActivityView: CreateActivityView!

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Quick Log"
        setupView()

    }

    func setupView() {
        initializeCreateActivityView()
        self.view.addSubview(createActivityView)
        createActivityView.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor).isActive = true
        createActivityView.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor).isActive = true
        createActivityView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
        createActivityView.heightAnchor.constraint(equalToConstant: 50.0).isActive = true

    }

    func initializeCreateActivityView() {
        createActivityView = CreateActivityView()
        createActivityView.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: 50.0)
        createActivityView.translatesAutoresizingMaskIntoConstraints = false
        createActivityView.activityNameTextField.delegate = self
    }

    func enableCancelButton() {
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
    }
}

I added my CreateActivityView to my view controller. 我将CreateActivityView添加到了视图控制器中。 The button target is handled by my createActvitiyView. 按钮目标由我的createActvitiyView处理。 So how can I access the rightbarbuttonitem from the subview? 那么如何从子视图访问rightbarbuttonitem?

You can try to use delegate 您可以尝试使用委托

class CreateActivityView: UIView {
  weak var delegate:VCName?

and

 createActivityView = CreateActivityView()
 createActivityView.delegate = self

after that inside any action do 之后在任何动作里面

 delegate?.methodInsideTheVC()

Or write button action inside the vc 在vc内编写按钮动作

createActivityView = CreateActivityView()
createActivityView.button.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)

and place 和地方

@objc func addButtonTapped() {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 单击下一个视图控制器的按钮时,如何显示加载标签? - How can I get my loading label to show up when I click button to next view controller? 如何从情节提要中的子视图(另一个视图控制器)内的按钮推动新的视图控制器 - How can I push a new View Controller from a button within a subView (another View Controller) in Storyboard 如何将文本字段的文本输入到视图控制器中? - How can I get the textfield's text into my view controller? 在Swift中我的视图控制器上找不到后退按钮 - Can't get a back button on my view controller in Swift 如何从多个子视图的视图控制器设置CAlayer边界 - How to set the CAlayer bounds from my view controller for multiple subview 如何取消分配视图控制器? - How can I deallocate my view controller? 我可以使用 SwiftUI 工作表视图中的按钮(出现在我的主 SwiftUI 视图顶部)来更改主视图内的子视图吗? - Can I use a button inside a SwiftUI sheet view that appears on top of my main SwiftUI view to change a subview inside the main view? iOS Swift如何让我的SubView出现在我的SearchBar下方 - IOS swift How can I get my SubView to appear below my SearchBar 如何在不使其成为我的根视图控制器的情况下从视图控制器转到拆分视图控制器 - How can I segue from view controller to Split view Controller Without making it my root View Controller 无法设计我的@IBDesignable视图的子视图 - Can't design subview of my @IBDesignable view
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM