Сбой в viewDidLoad () при регистрации наблюдателей - PullRequest
1 голос
/ 15 марта 2019

У меня произошел сбой в viewDidLoad.Я не могу понять, почему это происходит.Ниже приведена трассировка аварии и весь код.

crash

class WriteTestimonialViewController: UIViewController, UITextViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addPurpleBackground()

        title = "Write Testimonial"

        testimonialTextView.clearTextView(text: "Type testimonial")

        // Setup keyboard event
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
        // Dismiss keyboard
        self.hideKeyboardWhenTappedAround()
    }

    // Setup keyboard event
    @objc func keyboardWillShow(notification:NSNotification){
        var userInfo = notification.userInfo!
        var keyboardFrame:CGRect = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
        keyboardFrame = self.view.convert(keyboardFrame, from: nil)

        var contentInset:UIEdgeInsets = self.scrollView.contentInset
        contentInset.bottom = keyboardFrame.size.height
        scrollView.contentInset = contentInset
    }

    @objc func keyboardWillHide(notification:NSNotification){

        let contentInset:UIEdgeInsets = UIEdgeInsets.zero
        scrollView.contentInset = contentInset
    }

 }

extension UIViewController {

    // Dismiss keyboard on touch
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

func addPurpleBackground() {
    let imageViewBackground = UIImageView()
    imageViewBackground.image = UIImage(named: "bgimage")

    imageViewBackground.contentMode = .scaleAspectFill
    imageViewBackground.clipsToBounds = true
    imageViewBackground.translatesAutoresizingMaskIntoConstraints = false

    self.insertSubview(imageViewBackground, at: 0)

    self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[imageViewBackground]|",
                                                       options: [],
                                                       metrics: nil,
                                                       views: ["imageViewBackground": imageViewBackground]))
    self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageViewBackground]|",
                                                       options: [],
                                                       metrics: nil,
                                                       views: ["imageViewBackground": imageViewBackground]))
}

1 Ответ

0 голосов
/ 16 марта 2019

Я думаю, что было бы лучше зарегистрироваться для уведомлений в viewWillAppear / viewDidAppear, вы будете заинтересованы в уведомлениях, только если представление действительно отображается.Если вы держите его в viewDidLoad, иногда может случиться так, что представление было загружено, но не сразу появилось на экране.

Также В iOS 9 вам больше не нужно вручную удалять наблюдателя.

В OS X 10.11 и iOS 9.0 NSNotificationCenter и NSDistributedNotificationCenter больше не будут отправлять зарегистрированным наблюдателям уведомления, которые могут быть освобождены

...