Swiftは選択問題ライブラリインタフェースを作成します(TableViewCellのButtonのselected状態の混乱とジェスチャーイベントのブロックの問題を解決します)-3

7088 ワード

Swiftは選択問題ライブラリインタフェースを作成します(TableViewCellのButtonのselected状態の混乱とジェスチャーイベントのブロックの問題を解決します)-1
Swiftは選択問題ライブラリインタフェースを作成します(TableViewCellのButtonのselected状態の混乱とジェスチャーイベントのブロックの問題を解決します)-2
Swiftは選択問題ライブラリインタフェースを作成します(TableViewCellのButtonのselected状態の混乱とジェスチャーイベントのブロックの問題を解決します)-3
ジェスチャーイベントがブロックされた問題
各optionsBtnにtagを設定することでCellでbuttonに応答しないという問題を解決することができますが、optionsLabelをクリックしたときにbuttonのクリックイベントにも応答するにはどうすればいいのでしょうか.
Cell View :
contentView -> backView -> (optionsBtn,optionsLabel,...)```

    optionLabel ? , contentView , backView( , , )。 :

1.backmiewにクリックジェスチャーを追加する2.gestureRecognizer(gestureRecognizer:UIGestureRecognizer,shouldReceiveTouch touch)->Bool法によりtouchを取得し、touch.gestureRecognizersはジェスチャーをブロックするかどうかを判断し,return trueはブロック,return falseはブロックしない.ジェスチャーを追加しないならGestureRecognizersはnilにUItapGestureRecognizerジェスチャーを追加しましたgestureRecognizers=[UITapGestureRecognizer]. 3.応答ジェスチャーのactionでは、ジェスチャーがあるpointXがどのoptionsLabelにあるかによって、どのoptionsLabelをクリックしたか、対応するのはどのbuttonかを判断する``
コードは次のとおりです.
//XXWDCell.swift
override func drawRect(rect: CGRect) {
    backView.layer.cornerRadius = 10
    backView.layer.masksToBounds = true
        
    // backView 
    let tag = UITapGestureRecognizer(target: self, action: #selector(XXWDCell.gestureRecognizerAction(_:)))
    self.backView.addGestureRecognizer(tag)
        
}

func gestureRecognizerAction(tag:UIGestureRecognizer) {
    // touch backView , optionLabel 
    let pointX = tag.locationInView(self.backView)        
    for i in 0.. Bool {
    if touch.gestureRecognizers == nil {
        return true
    }
    for tag in touch.gestureRecognizers! {
        if tag.isKindOfClass(UITapGestureRecognizer) {
            return false
        }
    }        
    return true  
}

これでoptionsLabelをクリックするとoptionsBtnも変化します.
答えを得る
1.selectAnswerActionはイベントをクリックして、答えを取得し、blockでviewcontrollerに伝え、メタグループ(Bool,String)、boolが答えが正しいかどうか、stringが「ABC」という文字列で、boolを伝えるのはどれだけの正解があるかを統計することである.updateBtnsSelectedStateラジオでは1つしか選択できません:optionsBtnを巡回し、現在選択されているbuttonでない場合、btn.selected = false 3.answer()は、単純にラジオであれば現在選択されているもののみを保持し、複数選択であれば重複を削除します.最初は1、2、3、4番目のbuttonをA、B、C、Dに変換することです.私のアルゴリズムは、クリックするたびに、どれが選択されたかを判断し、addをselectedArrayに追加し、選択されていないものを削除することです.例を挙げると、複数選択で、私は先にDをクリックして、それからCをクリックして、それからDをクリックしてキャンセルして、それからAをクリックしてAを選択したいかもしれません.1回目はselectedArray=["D"],2回目["D","C"],3回目["C"],4回目["C","A"]をクリックし,["A","C"]をソートしstring解答ACに変換する.
//XXWDCell.swift
let answerList = ["A","B","C","D","E","F","G","H","I","J"]    
typealias SelectType = (Bool,String)-> ()    
var selecteAnswerBlock:SelectType?
var selectedArray:NSMutableArray = NSMutableArray()
var selecteStateArray:NSMutableArray = NSMutableArray()
@IBAction func selectAnswerAction(sender: UIButton) {
        if self.selecteAnswerBlock != nil {
            sender.selected = !sender.selected
            updateBtnsSelectedState(sender)// , 
            let answer = answer(sender)
            selecteAnswerBlock!((answer.0,answer.1))// answer(sender).0,answer(sender).1 answer(sender)
        }
    }
    
    func updateBtnsSelectedState(sender:UIButton) {
        if model!.type == " " {
            let tag = 100 + model!.index.integerValue * 4
            let btns = [self.viewWithTag(tag),self.viewWithTag(tag + 1),self.viewWithTag(tag + 2),self.viewWithTag(tag + 3)]
            for view in btns {
                let btn = view as! UIButton
                if sender != btn {
                    btn.selected = false
                }
            }
        }
    }
    
    func answer(sender:UIButton) -> (Bool,String){
        var selectedAnswer:String = ""
        if sender.selected {
            if model!.type == " " {
                selectedArray.removeAllObjects()
                selectedArray = [self.answerList[sender.tag - 100 - model!.index.integerValue * 4]]
            }
            if model!.type == " " {
                selectedArray.addObject(self.answerList[sender.tag - 1000 - model!.index.integerValue * 4])
            }
        }else {
            // 
            if model!.type == " " {
                selectedArray.removeAllObjects()
            }
            if model!.type == " " {
                for char in selectedArray {
                    if char as! String == self.answerList[sender.tag - 1000 - model!.index.integerValue * 4] {
                        selectedArray.removeObject(char)
                    }
                }
            }
        }
        
        // 
        let sortedArray = selectedArray.sort { (s1, s2) -> Bool in
           return (s1 as! String) < (s2 as! String)
        }
        
        // String
        for c in sortedArray {
            if model?.type == " " {
                selectedAnswer =  c as! String
            } else {
                selectedAnswer = selectedAnswer + (c as! String)
            }
        }
        
        // 
        if sortedArray.count == 0 {
            selectedAnswer = ""
        }
        
        // , , 
        if model!.type == " " {
            selectedArray.removeAllObjects()
        }
        return (selectedAnswer == model?.answer,selectedAnswer)
    }

混乱をどのように解決するかという問題の混乱は、最初のcellでAオプションが選択されていることです.後ろの4、8番目のcellではAオプションが選択されていますが、4、8番目のcellではbuttonクリックイベントに応答していません.buttonのクリック時間に応答しないのは良いが、他のcellでも選択されている場合を解決すればいい.
解決策は、tableview willdisplayメソッドでは、まずすべてのoptionsBtnのselected=falseを、得られた答えに基づいてoptionsBtnの状態を設定、例えば、答えはABCであり、答えにAがあればoptionsBtn[0]を設定.selected=trueはこのように推定されます.
singleChoiceArray,multipleChoiceArrayはそれぞれラジオと複数選択のテーマ配列である
//XXWDController.swift
var scores:Int = 0// 
lazy var singleChoiceResult:NSMutableArray = {// bool
        let aArray = NSMutableArray()
        for i in 0..