【问题标题】:Error when try to unwrap realm object尝试解开领域对象时出错
【发布时间】:2018-05-23 11:20:22
【问题描述】:

当我尝试使用来自领域对象之一的数据时,我遇到了以下问题 我有一个错误:

线程 1:致命错误:在展开可选值时意外发现 nil

我很困惑,因为当我尝试在调试控制台上手动执行时,一切正常

(lldb) 打印餐点?.mealName (字符串?)$R0 = "Krem buraczany"

我会附上整个代码,告诉你错误出现在哪一行

领域对象:

import UIKit
import RealmSwift

class Meal: Object {

@objc dynamic var mealID : String = ""
@objc dynamic var mealName : String = ""
var ingredients = List<String>()
var mealDescription = List<String>()
@objc dynamic var kcal : Int = 0
@objc dynamic var preparingTime : Int = 0
@objc dynamic var imageName : String = ""

convenience init(mealID: String, mealName: String, kcal: Int, preparingTime: Int, imageName: String) {
    self.init()

    self.mealID = mealID
    self.mealName = mealName
    self.kcal = kcal
    self.preparingTime = preparingTime
    self.imageName = imageName

}

override static func primaryKey() -> String? {
    return "mealID"
}

}

通过 segue 发送数据:

    @IBAction func ideaForMealButtonPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "ideaForMeal", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let destinationVC = segue.destination as! IdeaForMeal
    destinationVC.randomMeal = getRandomMeal()

}

func getRandomMeal() -> String {

    var mealsCount = realm.objects(Meal.self).count
    mealsCount += 1
    let randomMealID = arc4random_uniform(UInt32(mealsCount))
    print (randomMealID)

    return String(randomMealID)

}

接收者:

//Global Variables
let realm = try! Realm()
var randomMeal : String? {
    didSet {
        let selectedMeal = downloadMealData(mealID: randomMeal!)
        setUIForMeal(meal: selectedMeal)
    }
}


override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround()

}

//Background Operations

func downloadMealData(mealID: String?) -> Meal? {

    let currentMeal = realm.object(ofType: Meal.self, forPrimaryKey: mealID)
    return currentMeal

}

func checkPositionOfTopIngredientsLabel() -> CGFloat {

    let maxY = ingredientsTopLabel.frame.maxY
    return maxY

}

func setUIForMeal(meal: Meal?) {

    mealNameLabel.text = meal!.mealName // Error!
    mealImage.image = UIImage(named: meal!.imageName)
    preparingTimeLabel.text = String(meal!.preparingTime)
    kcalLabel.text = String(meal!.kcal)

}

谢谢!

BR iMat

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    该错误与 Realm 无关。这是一个非常常见的视图生命周期错误。

    在目标视图控制器中设置randomMeal 会触发didSet 观察者。观察者将访问尚未连接的IBOutlet。

    解决办法是运行viewDidLoad中的代码

    var randomMeal = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.hideKeyboardWhenTappedAround()
        if !randomMeal.isEmpty {
            let selectedMeal = downloadMealData(mealID: randomMeal)
            setUIForMeal(meal: selectedMeal)
        }
    
    }
    

    【讨论】:

    • 工作正常!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2023-02-25
    • 2015-06-06
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多