Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在UITableViewController中引用自定义UIView的子视图按钮_Ios_Swift_Uitableview_Uiview - Fatal编程技术网

Ios 如何在UITableViewController中引用自定义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) {

我在重复使用UITableViewCell时遇到了问题,我收到了一些建议,建议在UITableViewController中执行UIButton操作。 问题是,因为UIButton是在自定义UIView子类中实例化的,所以我找不到引用它的方法

代码是:

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
give
UIView
not
UIButton
UIView
没有
。选中的
属性

应该执行以下代码或类似操作。您必须将tour
UIView
转换为
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子视图的成员。