Область. Обновление данных в нескольких ViewControllers

#ios #swift #uiviewcontroller #realm

#iOS #swift #uiviewcontroller #realm

Вопрос:

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

 class FunctionData: Object {
    @objc dynamic var Name = ""
    @objc dynamic var status = false
    @objc dynamic var statusComment = ""
    @objc dynamic var tester = ""
    
    override static func primaryKey() -> String? {
        return "functionNames"
    }
}
  

Я создал TableViewController с «Именем» в качестве имени для каждой ячейки. Я хочу щелкнуть по ячейке и перейти к «SecondViewController» и там заполнить другую информацию, например, тестер и комментарий.
TableViewController работает хорошо.
вот код, чтобы перейти ко второму ViewController:

 var functions: Results<FunctionData>?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            
            tableView.deselectRow(at: indexPath, animated: true)
            let function = functions![indexPath.row]
            
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let functionsVC = storyboard.instantiateViewController(identifier: "functionsVC") as! FunctionsRatingViewController
            functionsVC.name = function.functionNames
            functionsVC.functionID = function.functionNames

if let indexPath = tableView.indexPathForSelectedRow {
                functionsVC.selectedFunction = functions![indexPath.row]
            }
            
            self.present(functionsVC, animated: true, completion: nil)
        
    }
  

Но в моем SecondVC я не могу сохранить другую информацию в выбранном «Элементе». Я пытаюсь сделать это с помощью AlertController

 var selectedFunction: FunctionData? {
        didSet {
        }
    }


func showAlert() {
        
        var textField = UITextField()
        
        let alert = UIAlertController(title: "Status not OK", message: nil, preferredStyle: .alert)

            alert.addTextField {
                $0.placeholder = "Comment"
                $0.addTarget(alert, action: #selector(alert.textDidChangeInLoginAlert), for: .editingChanged)
            }
        
            alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))

            let loginAction = UIAlertAction(title: "Save", style: .default) { [unowned self] _ in
                
                    if let currentFct = self.selectedFunction {
                        do {
                            try self.realm.write {
                                currentFct.realm?.create(FunctionData.self, value: ["statusComment": textField.text], update: .modified)
                            }
                        } catch {
                            print("Error trying to append a Comment, (error)")
                        }
                    }
 print("Comment saved")
 
            }
            loginAction.isEnabled = false
            alert.addAction(loginAction)
            present(alert, animated: true)
        }
  

Большое спасибо за любую помощь!

Ответ №1:

Первичный ключ вашего объекта Realm отображается как return "functionNames"

 class FunctionData: Object {
    @objc dynamic var Name = ""
    @objc dynamic var status = false
    @objc dynamic var statusComment = ""
    @objc dynamic var tester = ""
    
    override static func primaryKey() -> String? {
        return "functionNames"
    }
}
  

но вы не включили это свойство в объект, поэтому оно не будет работать.

Обновите свой объект, чтобы включить это свойство

 class FunctionData: Object {
    @objc dynamic var functionName = UUID().uuidString //for example
    @objc dynamic var Name = ""
    @objc dynamic var status = false
    @objc dynamic var statusComment = ""
    @objc dynamic var tester = ""
    
    override static func primaryKey() -> String? {
        return "functionNames"
    }
}
  

Кроме того, первичные ключи уникальны и единственны, поэтому называть их functionNames , вероятно, не лучший ход. Попробуйте functionName или даже, и более уместно function_id .

Могут возникнуть дополнительные проблемы, но это первое, что следует решить.