在 Class Swift 中更改函数

On Change Function In Class Swift

我创建了一个 DropDownMenu class,但我需要知道 ViewController 中的值何时更改。就像 UIScrollView didScroll,但是对于我 class.

中的值更改
func scrollViewDidScroll(_ scrollView: UIScrollView)

我需要这样的东西,但是 class!

这是 class...

class DropDownMenu: UIStackView {
    
    var options: [String]! = [] // Labels for all of the options
    var titleButton: UIButton! = UIButton() // The Main Title Button
    var target: UIViewController! // The target to get the main view. Maybe remove and automatically do it later
    var textColor: UIColor! = UIColor.black // The Color of the text of the options
    var bgColor: UIColor! = UIColor.clear
    var borderWidth: CGFloat! = 0.0
    var borderColor: CGColor! = UIColor.black.cgColor
    var uiBorderColor: UIColor? = nil
    var cornerRadius: CGFloat! = 0.0
    var font: UIFont! = UIFont.systemFont(ofSize: 18)
    var images: [UIImage]? = nil
    var imageInsets: [UIEdgeInsets]? = nil
    var imageInset: UIEdgeInsets? = nil
    
    var value: String! {
        get {
            return currentSelected
        }
        set {
            currentSelected = newValue
        }
    }
    
    private var currentSelected: String! = ""
    
    init(options: [String]) {
        self.options = options
        
        super.init(frame: CGRect.zero)
        
        self.translatesAutoresizingMaskIntoConstraints = false
        self.axis = .vertical
    }
    
    init(titleButton: UIButton) {
        self.titleButton = titleButton
        
        super.init(frame: CGRect.zero)
        
        self.translatesAutoresizingMaskIntoConstraints = false
        self.axis = .vertical
    }
    
    func createDropDownMenu() {
        currentSelected = titleButton.titleLabel?.text
        let mainFrame = titleButton.frame
        print("Frame: \(mainFrame)")
        print("StackView frame: \(self.frame), axis: \(self.axis)")
        
        if uiBorderColor != nil {
            borderColor = uiBorderColor!.cgColor
        }
        
        self.widthAnchor.constraint(equalToConstant: mainFrame.width).isActive = true
        self.leftAnchor.constraint(equalTo: titleButton.leftAnchor).isActive = true
        self.topAnchor.constraint(equalTo: titleButton.bottomAnchor, constant: self.spacing).isActive = true
        
        var y: CGFloat = 0
        var place = 0
        
        for title in self.options {
            let button = UIButton(frame: CGRect(x: 0, y: y, width: mainFrame.width, height: mainFrame.height))
            button.setTitle(title, for: .normal)
            button.setTitleColor(textColor, for: .normal)
            button.backgroundColor = bgColor
            button.addTarget(self, action: #selector(dropDownOptionClicked(_:)), for: .touchUpInside)
            button.layer.cornerRadius = cornerRadius
            button.layer.borderWidth = borderWidth
            button.layer.borderColor = borderColor
            button.titleLabel?.font = font
            
            if images != nil {
                button.setBackgroundImage(images![place], for: .normal)
                if imageInsets != nil {
                    button.imageEdgeInsets = imageInsets![place]
                } else if imageInsets == nil && imageInset != nil{
                    button.imageEdgeInsets = imageInset!
                } else {
                    button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
                }
            }
            
            print("Button: \(button), Title: \(String(describing: button.titleLabel?.text)), Target: \(button.allTargets)")
            
            button.isHidden = true
            button.alpha = 0
            
            self.addArrangedSubview(button)
            
            button.translatesAutoresizingMaskIntoConstraints = false
            button.widthAnchor.constraint(equalToConstant: mainFrame.width).isActive = true
            button.heightAnchor.constraint(equalToConstant: mainFrame.height).isActive = true
            
            print("Subviews: \(self.arrangedSubviews)")
            
            y += mainFrame.height
            place += 1
            print("y: \(y)")
        }
    }
    
    @objc func openDropDown(_ sender: UIButton) {
        print("Open DropDownMenu")
        self.arrangedSubviews.forEach { (button) in
            UIView.animate(withDuration: 0.7) {
                button.isHidden = !button.isHidden
                button.alpha = button.alpha == 0 ? 1 : 0
                self.target.view.layoutIfNeeded()
            }
        }
    }
    
    @objc private func dropDownOptionClicked(_ sender: UIButton) {
        let text = sender.titleLabel?.text
        print(text as Any)
        
        currentSelected = text
        print("Value: \(String(describing: value))")
        
        titleButton.setTitle(text, for: .normal)
        openDropDown(sender)
    }
    
    init() {
        super.init(frame: CGRect.zero)
        
        self.translatesAutoresizingMaskIntoConstraints = false
        self.axis = .vertical
    }
    
    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这是ViewController中的创作...

let titleButton = UIButton(frame: CGRect(x: 50, y: 290, width: 100, height: 40))
titleButton.backgroundColor = UIColor.white
titleButton.setTitle("Grade", for: .normal)
titleButton.setTitleColor(UIColor.black, for: .normal)
titleButton.layer.borderWidth = 2
titleButton.layer.cornerRadius = 10
        
let dp = DropDownMenu(options: ["1", "Freshman", "Sophomore", "Junior", "Senior", "College"])
dp.titleButton = titleButton
dp.target = self
dp.borderWidth = 2
dp.spacing = 5
dp.cornerRadius = 10
dp.bgColor = UIColor.white
        
titleButton.addTarget(dp, action: #selector(dp.openDropDown(_:)), for: .touchUpInside)

infoBox.addSubview(titleButton)
infoBox.addSubview(dp)
dp.createDropDownMenu()

class 按预期工作。

我真的需要这方面的帮助。没有答案是不好的。这是我所有的代码。

你通常用委托来做:

class DropDownMenu: UIStackView {
    weak var delegate: DropDownMenuDelegate?

    var value: String! {
        get {
            return currentSelected
        }
        set {
            if currentSelected != newValue {
                currentSelected = newValue
                self.delegate?.valueDidChange(self)
            }
        }
    }
}

protocol DropDownMenuDelegate: class {
    func valueDidChange(_ menu: DropDownMenu)
}

然后在您的视图控制器中:

let dp = DropDownMenu(options: ["1", "Freshman", "Sophomore", "Junior", "Senior", "College"])
dp.delegate = self

(因为我不在Xcode所以盲打所以可能有语法错误)