다음과 같은 문제가 있습니다. 때때로 현재 화면 위에 그림을 표시하는 ViewController를 닫을 때 화면이 멈추는 경우.Swift : 때때로 화면 멈춤 현재 컨텍스트를 통해 그림을 표시하는 ViewController 닫기
누군가이 문제를 해결하는 방법에 대한 통찰력을 제공 할 수 있습니까?
내 코드의 샘플은 아래의 발견 :
수입 UIKit
클래스 ViewControllerCell : UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.white
addSubview(showPhotoButton)
showPhotoButton.leftAnchor.constraint(equalTo: leftAnchor, constant: 200).isActive = true
showPhotoButton.bottomAnchor.constraint(equalTo: topAnchor, constant: 160).isActive = true
showPhotoButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
showPhotoButton.widthAnchor.constraint(equalToConstant: 70).isActive = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
lazy var showPhotoButton: UIButton = {
let button = UIButton(type: .system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Show", for: .normal)
button.addTarget(self, action: #selector(showSale), for: .touchUpInside)
button.setTitleColor(UIColor(r: 120, g: 80, b: 255), for: .normal)
return button
}()
@objc func showSale() {
let popupViewController = PopupViewController()
popupViewController.modalPresentationStyle = .overCurrentContext
popupViewController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
window!.rootViewController?.present(PopupViewController, animated: true, completion: nil)
}
}
수입 UIKit을
클래스 SalePopupViewController : UIViewController에 {
override func viewDidLoad() {
view.backgroundColor = UIColor(white: 1, alpha: 0.60)
view.isOpaque = false
view.addSubview(rebateImage)
view.addSubview(dismissButton)
dismissButton.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
dismissButton.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
dismissButton.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
dismissButton.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
rebateImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
rebateImage.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -35).isActive = true
rebateImage.heightAnchor.constraint(equalToConstant: 290).isActive = true
rebateImage.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true
}
let dismissButton: UIButton = {
let button = UIButton(type: .system)
button.addTarget(self, action: #selector(dismissPopup), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
let rebateImage: UIImageView = {
let image = UIImageView()
image.translatesAutoresizingMaskIntoConstraints = false
image.layer.masksToBounds = false
image.layer.cornerRadius = 2
image.contentMode = .scaleAspectFill
image.clipsToBounds = true
image.image = UIImage(named: "SaleCostco")
return image
}()
@objc func dismissPopup() {
DispatchQueue.global(qos: .userInitiated).async {
DispatchQueue.main.async {
self.dismiss(animated: true, completion: nil)
}
}
}
}
디버깅 팁 : 화면이 정지가, 엑스 코드의 디버거에서 응용 프로그램을 일시 정지하고 주 스레드에서 무슨 일이 일어나고 있는지 검사합니다. –
자기가 약하게하지 않고 비동기식으로 닫는 것과 같은 UI 작업을하는 것은 많은 문제를 야기합니다. 상황에 따라 (이 경우에는 약한 자기가 적당 할 것입니다) 항상 자기 자신의 약한 자기를하고 자기를 참조하는 것이 좋습니다. 자기로서 기각해라 .dismiss. 그런데 왜 글로벌 대기열로 dip 한 다음 메인 대기열로 되돌려 야합니까? 필요한 것 같지 않습니다 –
도와 주셔서 감사합니다! 문제가 해결되었습니다! –