Ios 如何在UITableViewController中引用自定义UIView的子视图按钮
我在重复使用UITableViewCell时遇到了问题,我收到了一些建议,建议在UITableViewController中执行UIButton操作。 问题是,因为UIButton是在自定义UIView子类中实例化的,所以我找不到引用它的方法 代码是:Ios 如何在UITableViewController中引用自定义UIView的子视图按钮,ios,swift,uitableview,uiview,Ios,Swift,Uitableview,Uiview,我在重复使用UITableViewCell时遇到了问题,我收到了一些建议,建议在UITableViewController中执行UIButton操作。 问题是,因为UIButton是在自定义UIView子类中实例化的,所以我找不到引用它的方法 代码是: class StarButton: UIView { var buttonRow : Int = 0 var buttonSelected : Bool = false override init (frame : CGRect) {
class StarButton: UIView {
var buttonRow : Int = 0
var buttonSelected : Bool = false
override init (frame : CGRect)
{
super.init(frame : frame)
initStar()
}
required init?(coder aDecoder: NSCoder){
super.init(coder: aDecoder)
initStar()
}
func initStar(){
let filledStarImage = UIImage(named: "filledStar")
let emptyStarImage = UIImage(named: "emptyStar")
let button = UIButton(frame: CGRect(x: 2, y: 2, width: 33, height: 33))
button.userInteractionEnabled = true
button.addTarget(self, action: #selector(StarButton.fillingStar(_:)), forControlEvents: UIControlEvents.TouchUpInside)
button.setImage(emptyStarImage, forState: .Normal)
button.setImage(filledStarImage, forState: .Selected)
if buttonSelected == true{
button.selected = true
}
addSubview(button)
}
//Could have various errors
func fillingStar(sender: UIButton){
if (sender.selected) == false{
FavoritesManager.favoritesList.setObject(ChemQuizCollection.wordListObject.quizList[buttonRow], forKey: "\(buttonRow)")
sender.selected = !sender.selected
FavoritesManager.favoritesList.synchronize()
} else{
FavoritesManager.favoritesList.removeObjectForKey("\(buttonRow)")
sender.selected = !sender.selected
FavoritesManager.favoritesList.synchronize()
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
for view in subviews
{
view.touchesBegan(touches, withEvent: event)
}
}
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool
{
return true
}
类开始按钮:UIView{
变量按钮箭头:Int=0
var buttonSelected:Bool=false
重写初始化(帧:CGRect)
{
super.init(frame:frame)
initStar()
}
必需的初始化?(编码器aDecoder:NSCoder){
super.init(编码者:aDecoder)
initStar()
}
func initStar(){
让filledStarImage=UIImage(名为:“filledStar”)
让emptyStarImage=UIImage(名为:“emptyStar”)
let button=ui按钮(帧:CGRect(x:2,y:2,宽度:33,高度:33))
button.userInteractionEnabled=true
button.addTarget(self,action:#选择器(StarButton.fillingStar(:)),forControlEvents:UIControlEvents.TouchUpInside)
button.setImage(emptyStarImage,forState:.正常)
button.setImage(filledStarImage,forState:.选定)
如果buttonSelected==true{
button.selected=true
}
添加子视图(按钮)
}
//可能会有各种错误
func fillingStar(发送方:UIButton){
if(sender.selected)=false{
FavoritesManager.favoritesList.setObject(ChemQuizCollection.wordListObject.quizList[buttonRow],forKey:“\(buttonRow)”)
sender.selected=!sender.selected
FavoritesManager.favoritesList.synchronize()
}否则{
FavoritesManager.favoritesList.removeObjectForKey(“\(buttonRow)”)
sender.selected=!sender.selected
FavoritesManager.favoritesList.synchronize()
}
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?)
{
用于在子视图中查看
{
view.TouchesBegined(触摸,withEvent:event)
}
}
覆盖func pointInside(点:CGPoint,withEvent:UIEvent?->Bool
{
返回真值
}
}
这是自定义UIView子类。我想引用func initStar()中的“按钮”。
使用
对于实例化StarButton.subview中的子视图{
subview.selected=true
}
抛出一个错误,说明UIView没有“选中”成员。有更好的办法吗
提前感谢大家。buttonSelected设置为false,而您仅在其为true时更改按钮的状态。这就是为什么你会出错
您可以将buttonSelected更改为true,或者更好地为按钮指定一个标记,并将该标记与fillingStar中的“发件人”进行比较。问题在于您的代码
StarButton.subviews{ subview.selected = true }
.subview
giveUIView
notUIButton
:UIView
没有。选中的属性
应该执行以下代码或类似操作。您必须将tourUIView
转换为UIButton
let filtured = instantiatedStarButton.subviews.filter({
if let button = $0 as? UIButton{
return button.selected
}
return false
})
谢谢你的回答。这真的很有帮助:)。$0是什么意思?数组中的每个元素,这就是$0的意思。请检查文件,如果让啊感谢您的快速回答问题:)。我只是查了一下$0,想知道它的意思,然后意识到你已经回答了!非常感谢。buttonSelected设置为false作为默认值。它既不影响也不解释原因。selected不是my StarButton子视图的成员。