2016-12-05 22 views
0

私はテーブルをオーバーレイしています。バックグラウンドにTapジェスチャ認識機能を追加して、ビューを閉じてオーバーレイ内のボタンにaddTarget同じことをする。addTargetとaddGestureRecognizerが機能していない、クラッシュ/エラーが発生していない

オーバーレイは正常に表示されますが、黒い背景やキャンセルボタンをタップすると何も起こりません。私はここで答えを探しましたが、見つかったものは何も働いていませんでした。私のコードは、オーバーレイのスクリーンショットに続いて、次のとおりです。

class importedFileView: NSObject { 

let blackView = UIView() 

let importedFileContainerView: UIView = { 
    let importedFileContainerView = UIView(frame: .zero) 
    importedFileContainerView.backgroundColor = .white 
    importedFileContainerView.layer.cornerRadius = 10 
    importedFileContainerView.layer.masksToBounds = true 
    return importedFileContainerView 
}() 

let headerLabel: UILabel = { 
    let headerLabel = UILabel() 
    headerLabel.translatesAutoresizingMaskIntoConstraints = false 
    headerLabel.font = UIFont(name: "HelveticaNeue-Thin" , size: 24) 
    headerLabel.text = "Attach file" 
    headerLabel.textColor = .darkGray 
    headerLabel.adjustsFontSizeToFitWidth = true 
    return headerLabel 
}() 

let fileTableView: UITableView = { 
    let fileTableView = UITableView() 
    return fileTableView 
}() 


let updateDetailsButton: UIButton = { 
    let updateDetailsButton = UIButton() 
    updateDetailsButton.translatesAutoresizingMaskIntoConstraints = false 
    updateDetailsButton.backgroundColor = UIColor(r:40, g:86, b:131) 
    updateDetailsButton.setTitleColor(UIColor.white, for: .normal) 
    updateDetailsButton.setTitle("Attach selected files", for: .normal) 
    updateDetailsButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light" , size: 18) 
    updateDetailsButton.layer.cornerRadius = 2 
    return updateDetailsButton 
}() 

let cancelButton: UIButton = { 
    let cancelButton = UIButton() 
    cancelButton.translatesAutoresizingMaskIntoConstraints = false 
    cancelButton.backgroundColor = UIColor.white 
    cancelButton.setTitleColor(UIColor(r:40, g:86, b:131), for: .normal) 
    cancelButton.setTitle("Cancel", for: .normal) 
    cancelButton.titleLabel!.font = UIFont(name: "HelveticaNeue-Light" , size: 18) 
    cancelButton.layer.cornerRadius = 2 
    return cancelButton 
}() 

let frameHeight: CGFloat = 450 

func showFormView(){ 

    if let window = UIApplication.shared.keyWindow { 
     blackView.backgroundColor = UIColor(white: 0, alpha: 0.5) 


     window.addSubview(blackView) 
     window.addSubview(importedFileContainerView) 
     importedFileContainerView.addSubview(headerLabel) 
     importedFileContainerView.addSubview(fileTableView) 
     importedFileContainerView.addSubview(updateDetailsButton) 
     importedFileContainerView.addSubview(cancelButton) 

     cancelButton.addTarget(self, action: #selector(handleDismiss), for: .touchUpInside) 
     blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss))) 

     layoutViews() 

     fileTableView.frame = CGRect(x: 30, y: window.frame.height, width: window.frame.width - 60, height: 230) 
     let frameY = (window.frame.height - frameHeight)/2 

     importedFileContainerView.frame = CGRect(x: 20, y: window.frame.height, width: window.frame.width - 40, height: self.frameHeight) 

     blackView.frame = window.frame 
     blackView.alpha = 0 

     UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
      self.blackView.alpha = 1 
      self.importedFileContainerView.frame = CGRect(x: 20, y: frameY, width: window.frame.width - 40, height: self.frameHeight) 
     }, completion: nil 
     ) 
    } 
} 


func layoutViews(){ 
    let views = ["v0" : headerLabel, "v1": fileTableView, "v2": updateDetailsButton, "v3": cancelButton] 

    let leftSpace = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20.0-[v0]-20.0-|", options: NSLayoutFormatOptions(), metrics: nil, views: views) 
    let leftSpace1 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20.0-[v1]-20.0-|", options: NSLayoutFormatOptions(), metrics: nil, views: views) 
    let leftSpace2 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20.0-[v2]-20.0-|", options: NSLayoutFormatOptions(), metrics: nil, views: views) 
    let leftSpace3 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-20.0-[v3]-20.0-|", options: NSLayoutFormatOptions(), metrics: nil, views: views) 

    let topSpacing = NSLayoutConstraint.constraints(withVisualFormat: "V:|-20.0-[v0(40)]-20.0-[v1(230)]-20.0-[v2(50)]-10.0-[v3(50)]-10.0-|", options: NSLayoutFormatOptions(), metrics: nil, views: views) 

    importedFileContainerView.addConstraints(topSpacing) 
    importedFileContainerView.addConstraints(leftSpace) 
    importedFileContainerView.addConstraints(leftSpace1) 
    importedFileContainerView.addConstraints(leftSpace2) 
    importedFileContainerView.addConstraints(leftSpace3) 

} 

func handleDismiss() { 

    UIView.animate(withDuration: 0.5, 
        delay: 0.0, 
        options: .curveEaseInOut, 
        animations: { 
        self.blackView.alpha = 0 

        if let window = UIApplication.shared.keyWindow { 
         self.importedFileContainerView.frame = CGRect(x: 20, y: window.frame.height, width: window.frame.width - 40, height: self.frameHeight) 

        } 
    }, 
        completion: { [weak self] finished in 
        self?.blackView.removeFromSuperview() 
        self?.importedFileContainerView.removeFromSuperview() 
    }) 

} 

override init() { 
    super.init() 
} 
} 

enter image description here

答えて

0

オーバーレイが表示されている間にimportedFileViewのインスタンスを強く参照していますか?私がテストした限りでは、ターゲットが失われたとき、すべてのアクションは黙って無視されます。

例えば、これは動作しません:

@IBAction func someAction(_ sender: Any) { 
    let ifv = importedFileView() 
    ifv.showFormView() 

    //`ifv` is released at the end of this method, then your overlays are shown... 
} 

これは動作します:

let ifv = importedFileView() //keep the instance as a property of your ViewController. 
@IBAction func someAction(_ sender: Any) { 
    ifv.showFormView() 
} 

はプログラム UIViewisUserInteractionEnabled生成 trueにデフォルトです。明示的にそれを trueに設定する必要はありません。

UIViewクラスを...Viewという名前にしないでください。タイプ名の先頭に大文字を使用すると、経験豊かなSwiftプログラマーがコードを読みやすくすることができます。

+0

ビンゴ!ありがとうございました。クラスの名前を変更します、ありがとう。 –

2

self.blackView.isUserInteractionEnabled = true;

あなたはblackViewUIView)に追加する必要があるすべてです。

これがなければ、ビューにはインタラクションが有効になっていないため、ジェスチャ認識ツールのターゲット/アクションはトリガされません。

イベントは無視されます。

https://developer.apple.com/reference/uikit/uiview/1622577-isuserinteractionenabled

また、アニメーションの間にそれを無効にすることができます。

+0

私はそれを試みましたが、効果がなかったため、再び取り除きました。私はそれを戻して、何かが見えるかどうかを確認します。 –

+0

それを元に戻してもまだ動作していません。また、addTargetとGestureRecognizerをアニメーションの完了ブロックに移動して、無効にされていないことを確認して再度有効にしないようにしました。アニメーションが完了したことを確認するために、完了時にラインを印刷する。 –

関連する問題