我遇到以下情况。我使用XIB文件创建了自定义UIView
。我连接了一个继承自UIView
的VC并将其添加到File Owner属性。使用@IBOutlet
连接两个按钮并将两个按钮连接到相同的@IBAction
方法,该方法将切换背景颜色,以获得布尔效果。默认情况下,未选择任何按钮。
在我的ViewController.swift
文件中,与Storyboard中的View Controller相关联,我将其作为子视图添加到我的UICollectionView
单元格中。
基于我的两个模型类(Messages
和PermissionMessage
),我确定按钮的文本应该是什么。
我的愿望是为按钮添加功能,所以当点击按钮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
答案 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
中的插座
虽然我没有使用编译器完成所有这些操作,但是应该为你完成所有这些事情,所以我不保证我没有错误输入或错过任何东西。