#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
.
Могут возникнуть дополнительные проблемы, но это первое, что следует решить.