Inilah kelas ViewController yang bermasalah.

class ViewController: UIViewController {
    
    
    @IBOutlet weak var photoSelectActionSheet: UIButton!
    @IBOutlet weak var selectedImageView: UIImageView!
    
    var imagePicker: UIImagePickerController!
    var selectedImage: UIImage? = ni
    
    var iCloud = ICloud() // see below for code of that file
  
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Must use this system to check each time the view appears.
        // This is checked each time so if user goes into settings and come back in same session
        // then this will be updated => viewDidLoad is cached and not reloaded each time.
        NotificationCenter.default.addObserver(
            self,
            selector:#selector(ICloud.checkIfUserIsLoggedInIcloud), // PROBLEM IS HERE
            name: UIApplication.didBecomeActiveNotification,
            object: nil)
    }

    // more code not shown

}

Masalahnya ada di viewWillAppear: pusat notifikasi memanggil pemilih yang ada di file Model lain ICloud.swift:

import UIKit
import CloudKit



class ICloud {
    
    
    var isLoggedInIcloud: Bool? = nil
    var userIcloudId: String? = nil
    
    
    func getUserIcloudId() {
        // Run this only if user is logged into icloud, and we don't have yet its iCloud id.
        if isLoggedInIcloud ?? false && userIcloudId == nil {
            CKContainer.default().fetchUserRecordID(completionHandler: { (recordId, error) in
                if let id = recordId?.recordName {
                    print("userIcloudId set to: " + id)
                    self.userIcloudId = id
                }
                else if let error = error {
                    print(error.localizedDescription)
                }
            })
            
        }
        
        
    }
    
    @objc func checkIfUserIsLoggedInIcloud() {
        // Check if user is logged into iCloud
        CKContainer.default().accountStatus { accountStatus, error in
            if accountStatus == .available {
                self.isLoggedInIcloud = true
                print("isLoggedInIcloud set to true")
                
                self.getUserIcloudId()
                
                return
            }
            
            print("User is not logged into icloud")
        }
    }
    
}

Saya berharap "ICloud.checkIfUserIsLoggedInIcloud" yang diteruskan pemilih berfungsi. Ini tidak:

07-01-2020 11:46:12.931419+0200 QDog[53348:3422745] -[QDog.ViewController checkIfUserIsLoggedInIcloud]: pemilih tidak dikenal dikirim ke instance 0x7fcad5f0c1d0 2020-07-01 11:46:12.938567+0200 QDog[53348:3422745348:34227453 *** Menghentikan aplikasi karena pengecualian yang tidak tertangkap

Jika saya menambahkan kembali fungsi dan variabel dari ICloud.swift langsung ke file ViewController dan meneruskan ke pemilih "checkIfUserIsLoggedInIcloud" itu AKAN BEKERJA dengan benar.

Saya ingin memasukkan semua kode icloud ke dalam file model terpisah untuk memisahkan masalah dan membuat kode lebih jelas.

Pertanyaannya adalah: mengapa 'ICloud.checkIfUserIsLoggedInIcloud' yang diteruskan sebagai pemilih tidak berfungsi? Dan bagaimana cara membuatnya berfungsi dengan kode ICloud di filenya sendiri, dan bukan di file ViewController?

0
Robert Brax 1 Juli 2020, 12:51

1 menjawab

Jawaban Terbaik

Menurut dokumentasi, parameter pertama haruslah pengamat, yang dalam kasus Anda, Anda menunjuk ke self.

Dalam hal ini, self adalah ViewController Anda, yang tidak memiliki metode checkIfUserIsLoggedInIcloud. Untuk membuatnya berfungsi, sebagai pengamat, Anda harus meneruskan properti iCloud alih-alih self.

0
Bruno Guidolim 1 Juli 2020, 10:00