2017-12-14 8 views
0

다음과 같은 몇 가지 문제가 있습니다. 때때로 현재 화면 위로 그림을 표시하는 ViewController를 닫을 때 화면이 멈추는 경우.신속하게보기를 닫을 때 화면이 때때로 오류없이 고정됩니다.

누군가이 문제를 해결하는 방법에 대한 통찰력을 제공 할 수 있습니까?

일시 중지 버튼을 사용하여 주 스레드를 검사했지만 어떤 특별한 작업도 찾지 못했습니다.

Snapshot of what is happening when screen freezes

내 코드의 샘플은 아래의 발견 :

import UIKit 

class 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 = SalePopupViewController() 
    popupViewController.modalPresentationStyle = .overCurrentContext 
    popupViewController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve 
    window!.rootViewController?.present(PopupViewController, animated: true, completion: nil) 
    } 

} 

SalePopupViewController :

import UIKit 

class 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() { 
    weak var weakself = self 

    weakself?.dismiss(animated: true, completion: { print("dismissing")}) 






     } 

    } 

} 
+0

dismissPopup' 사용 좋은 것'self.dismiss' 직접 – mcgtrt

+0

이 이미 시도, 나는이었다 약한 자아를 사용하는 것이 좋지만 어느 것도 문제를 해결하지 못합니다. –

+0

PopupViewController와 SalePopupViewController의 차이점은 무엇입니까? – Vinodh

답변

1

우선 왜 대신 뷰 컨트롤러의 window!.rootViewController?에서 팝업 제시되어있다 너는 그걸 네가 부르는거야? 대신 present(PopupViewController, animated: true, completion: nil)을 사용하십시오.

두 번째로 약점은 완전히 불필요합니다. 자기가 메모리에서 해제되는 방법이 없으므로 해제 버튼이 여전히 존재하므로 자기에 대한 강한 참조를 유지할 수 있으므로 약점이 전혀 없습니다. .

편집 그래서 ViewControllerCell 콜렉션보기 세포 것을 보지 못했다. 지금이 솔루션은 다르다 : 당신은 몇 가지 옵션 1. 패스는 indexPath 기능

func collectionView(_ collectionView: UICollectionView, 
    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{ 
if let cell = collectionView.dequeueReusableCell(withIdentifier identifier: String) as? ViewControllerCell { 
//do your thing here 
cell.parentViewController = self 

} }

와의에서 항목의 셀을하고있는 각 셀에의 ViewController 참조가 물론 collectionViewCell에 public var를 설정해야합니다.

var parentViewController: UIViewController! 
// you can also use the viewController subclass name that you created 

//. 특정 기능을 사용하려는 경우 만 존재하는 경우에 당신이

그리고 마지막으로 당신은 당신이 parentViewController.present (...)를 사용하여 제시 곳은`에서

+0

(1) 창을 사용하고 있습니다! .rootViewController? 왜냐하면 viewcontrollercell에 "present"가 없기 때문입니다. (2) 두 번째로, 나는 당신에게 동의합니다. 나는 단지 이전 게시물에서 그렇게하도록 제안되었고 그것이 논리에 문제가 있는지보기로 결정했습니다. –

+0

내 수정 된 답변보기 –