如何检查是否从Swift中的XIB文件中单击了按钮?

时间:2017-11-09 18:11:51

标签: ios swift uiview

我遇到以下情况。我使用XIB文件创建了自定义UIView。我连接了一个继承自UIView的VC并将其添加到File Owner属性。使用@IBOutlet连接两个按钮并将两个按钮连接到相同的@IBAction方法,该方法将切换背景颜色,以获得布尔效果。默认情况下,未选择任何按钮。

enter image description here

在我的ViewController.swift文件中,与Storyboard中的View Controller相关联,我将其作为子视图添加到我的UICollectionView单元格中。

基于我的两个模型类(MessagesPermissionMessage),我确定按钮的文本应该是什么。

我的愿望是为按钮添加功能,所以当点击按钮1时,它将触发功能A,如果选择按钮2,则功能B.

此时我不知道应该在哪里执行此逻辑,以确定应该触发哪个函数。另外,因为我可以创建相同BooleanView.xib的不同实例,所以我无法将函数添加到该XIB文件的文件所有者类中,我是对的吗?

我想在didSelectItemAt的{​​{1}}方法中点击按钮,但我无法以编程方式添加名为UICollectionView的自定义UIView

根据点击的按钮,如何以及应该为每个实例按钮添加功能的正确方法是什么?

在我的示例中,我想确定当前实例所选按钮是BooleanView()还是Manual。如果手动,它将执行某些操作,例如在我的控制台中打印文本,如果选择了GPS,我想调用我存储在自定义单独的类/处理程序中的LocationManager的初始化程序。

此功能位于GPS的{​​{1}}方法内:

cellForItemAt

注意:UICollectionView变量是 if message is PermissionMessage { let bool = BooleanView() bool.frame = CGRect(x: 60, y: estimatedFrame.height + 15, width: estimatedFrame.width + 15 + 8, height: bool.frame.height) let permissionType = (message as! PermissionMessage).getTypeOfPermission() switch permissionType { case .camera: print("Case: camera") bool.leftButton.setTitle("Yes", for: .normal) bool.rightButton.setTitle("No", for: .normal) cell.addSubview(bool) case .location: print("Case: location") bool.leftButton.setTitle("Manual", for: .normal) bool.rightButton.setTitle("GPS", for: .normal) cell.addSubview(bool) } } 的选定数组条目。

添加到message的自定义UIView类:

indexPath.row

1 个答案:

答案 0 :(得分:0)

首先,您需要一种方式来沟通按下哪个按钮,enum将起作用:

enum BooleanViewState {
    case none
    case left
    case right
}

接下来,您的BooleanView需要能够将其状态告知感兴趣的各方。鉴于您只关心特定时刻的给定布尔视图的状态,最简单的方法是使用计算属性。此外,您当前进入视图设置按钮标题的方法不是最好的做法,所以我们也会添加替代方法:

class BooleanView: UIView {
    var boolViewState: BooleanViewState {
        get {
            if leftButton.backgroundColor == Constants.BOOL_BUTTON.enabled {
                return .left
            } else if rightButton.backgroundColor == Constants.BOOL_BUTTON.enabled {
                return .right
            } else {
                return .none
            }
        }
    }

    var buttonTitles = (leftTitle: "", rightTitle: "") {
        didSet {
            leftButton.setTitle(buttonTitles.leftTitle, for: .normal)
            rightButton.setTitle(buttonTitles.rightTitle, for: .normal)
        }
    }

    // The rest of you existing class
}

您可能需要在两个获取标题的按钮的插座中添加didSet。在按钮存在之前,标题可能被设置。

接下来,您需要从使用默认UICollectionViewCell切换到可以容纳BooleanView的自定义子类并来回传递信息:

class BooleanViewCell: UICollectionViewCell {
    @IBOutlet private var boolView: BooleanView!

    var boolViewState: BooleanViewState {
        get {
            return boolView.boolViewState
        }
    }
    var buttonTitles = (leftTitle: "", rightTitle: "") {
        didSet {
            boolView.buttonTitles = buttonTitles
        }
    }
}

您需要更改cellForItemAt方法

中的一些代码
    if message is PermissionMessage {
        let permissionType = (message as! PermissionMessage).getTypeOfPermission()

        switch permissionType {
        case .camera:
            print("Case: camera")

            cell.buttonTitles = (leftTitle: "Yes", rightTitle: "No")
        case .location:
            print("Case: location")

            cell.buttonTitles = (leftTitle: "Manual", rightTitle: "GPS")
        }
    }

最后要做的是从boolState

中的单元格中读取didSelectItemAt
guard let cell = collectionView.cellForItem(at: indexPath) as? BooleanViewCell else { return }
let theState = cell.boolState
// React to the state as needed

这意味着您需要在故事板中的原型集合视图单元格中添加通用UIView,将其类设置为BooleanView并将其连接到BooleanViewCell中的插座

虽然我没有使用编译器完成所有这些操作,但是应该为你完成所有这些事情,所以我不保证我没有错误输入或错过任何东西。