Невозможно задать свойства объекта базы данных Realm в подробном представлении из-за необязательного значения nil - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть база данных областей с объектами Client, каждый из которых имеет свой собственный список документов.В моем SplitViewController у меня есть таблица, которая отображает все добавленные клиенты.При нажатии на клиента я могу отобразить все документы для этого конкретного клиента в другом виде таблицы.Проблема, возникающая при нажатии на документ, приводит к сбою приложения, и контроллер представления сведений выдает следующую ошибку: Поток 1. Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.

Я пытался устранить эту проблемуи у меня не было этой проблемы с главным экраном подробностей в другой части приложения, поэтому я чувствую, что эта проблема возникает либо из-за двух табличных представлений, либо из-за некоторой проблемы с базой данных Realm.

Одна странная вещь - это то же самое, что я получаю ту же фатальную ошибку, даже когда сам назначаю значение метки, не используя значения из моей базы данных.

Unexpected Error

Client.swift

import Foundation
import RealmSwift

class Client: Object {

@objc dynamic var name: String = ""
@objc dynamic var age: Int = 0
@objc dynamic var bond: Double = 0.0
@objc dynamic var continuances: Int = 0

//Realm syntax to define a to-many relationship meaning each Client can have a number of Document objects
let documents = List<Document>()

}

Document.swift

import Foundation
import RealmSwift

class Document: Object {
@objc dynamic var title: String = ""
@objc dynamic var image: String = ""

//An inverse relationship with each Document having an associatedClient that is of the
//type Client and it comes from the property called "documents" from the Client forward relationship
var associatedClient = LinkingObjects(fromType: Client.self, property: "documents")
}

DocumentTableViewController.swift

import UIKit
import RealmSwift

class DocumentTableViewController: UITableViewController {

let realm = try! Realm()
var documents : Results<Document>?

//Data type optional document because it will be nil until it is set
var selectedClient : Client? {
    //Everything in the did set function will happen as soon as this variable is set with a value
    didSet {
        loadDocuments()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

//Mark - Model Manipulation Methods

func loadDocuments(){

    //Pulls all document objects out of our realm (persistent data)
    documents = selectedClient?.documents.sorted(byKeyPath: "title", ascending: true)

    tableView.reloadData()
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return documents?.count ?? 0
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "goToDocumentDetails", sender: self)
}

//Load the documents for the selected client
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let navigationController = segue.destination as? UINavigationController
    let viewController = navigationController?.topViewController as? DocumentDetailsViewController

    if let indexPath = tableView.indexPathForSelectedRow {
        viewController?.selectedDocument = documents?[indexPath.row]
    }
}

//MARK: - HELPER FUNCTIONS FOR TESTING

@IBAction func addTestDocument(_ sender: UIBarButtonItem) {

    if let currentClient = self.selectedClient {
        do {
            try self.realm.write {
                let newDocument = Document()
                newDocument.title = "TEST"
                currentClient.documents.append(newDocument)
                print(documents?.count ?? 0)
            }
        } catch {
            print("Error saving new document")
        }
    }

    loadDocuments()

}

}

DocumentDetailsViewController.swift

import UIKit
import RealmSwift

class DocumentDetailsViewController: UIViewController {

let realm = try! Realm()
//var documents : Results<Document>?

@IBOutlet weak var titleLabel: UILabel!

//Data type optional document because it will be nil until it is set
var selectedDocument : Document? {
    //Everything in the did set function will happen as soon as this variable is set with a value
    didSet {
        titleLabel.textColor = UIColor.blue
        titleLabel.text = selectedDocument?.title
    }
}

Я ожидаю, что смогу программно изменять значения в моем DocumentsDetailViewController после передачи в выбранный объект Document, но попытка изменить значение любым способом приведет к исключению nil необязательного значения.

1 Ответ

0 голосов
/ 03 февраля 2019

Это распространенная ошибка / недоразумение.Это вообще не связано с Царством.

В данный момент вы звоните

viewController?.selectedDocument = documents?[indexPath.row]

розетки в контроллере вида назначения еще не подключены, поэтому titleLabel означает nil in didSet.


Возможное решение - переместить код в didSet в viewDidLoad

var selectedDocument : Document?

override func viewDidLoad() {
    super.viewDidLoad()
    titleLabel.textColor = UIColor.blue
    titleLabel.text = selectedDocument?.title
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...