问题描述
我正在开发一个对信息进行分类的简单应用程序。现在,我只是试图收集信息,然后将其添加到领域数据库中。不幸的是,我无法弄清楚,无论我尝试哪种方法(基于教程和Realm网站),都会收到错误消息“使用未解决的标识符'realm'。 这是基于执行命令的命令按钮的代码。
@IBAction func Submit(_ sender: Any) {
let myList = WineList()
myList.vinyard = Vinyard.text
myList.type = typeField.text
myList.name = Name.text
myList.grape = Grape.text
myList.year = Year.text
myList.price = Price.text
myList.rating = rateField.text
myList.purchased = purch
myList.notes = Notes.text
//from realm website example
try! realm.write{
realm.add(myList)
}
//from tutorials
//realm.beginWrite()
//realm.add(myList)
//try realm.commitWrite()
}
有人可以告诉我我做错了什么吗?我将在下面发布所有代码。
import UIKit
import RealmSwift
class RankViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
var purch = ""
@IBOutlet weak var typeField : UITextField!
@IBOutlet weak var rateField : UITextField!
@IBOutlet weak var Vinyard: UITextField!
@IBOutlet weak var Name: UITextField!
@IBOutlet weak var Grape: UITextField!
@IBOutlet weak var Year: UITextField!
@IBOutlet weak var Price: UITextField!
@IBOutlet weak var Notes: UITextField!
@IBAction func Purchased(_ sender: UISwitch) {
if (sender.isOn == true){
purch = "Yes"
}
else {
purch = "No"
}
}
let wineTypes = ["Red","White","Rose","Sparkling","Ice - Red","Ice - White","Port","Fruit","Other"]
let wineRate = ["Hurray","Meh","Boo"]
var typeView = UIPickerView()
var rateView = UIPickerView()
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
print (Realm.Configuration.defaultConfiguration.fileURL)
typeView.delegate = self
typeView.dataSource = self
rateView.delegate = self
rateView.dataSource = self
Vinyard.delegate = self
Name.delegate = self
Grape.delegate = self
Year.delegate = self
Price.delegate = self
Notes.delegate = self
typeField.inputView = typeView
rateField.inputView = rateView
}
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
if pickerView == typeView {
// Returns for typeView
return 1
}
else if pickerView == rateView {
// Returns for rateView
return 1
}
return 1
}
public func pickerView(_ pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int {
if pickerView == typeView {
// Returns for typeView
return wineTypes.count
}
else if pickerView == rateView {
// Returns for rateView
return wineRate.count
}
return wineRate.count
}
func pickerView(_ pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String? {
if pickerView == typeView {
// Returns for typeView
return wineTypes[row]
}
else if pickerView == rateView {
// Returns for rateView
return wineRate[row]
}
return wineRate[row]
}
func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int) {
if pickerView == typeView {
// Do stuff for typeView
typeField.text = wineTypes[row]
typeField.resignFirstResponder()
}
else if pickerView == rateView {
// Do stuff for rateView
typeField.text = wineRate[row]
typeField.resignFirstResponder()
}
}
@IBAction func Submit(_ sender: Any) {
let myList = WineList()
myList.vinyard = Vinyard.text
myList.type = typeField.text
myList.name = Name.text
myList.grape = Grape.text
myList.year = Year.text
myList.price = Price.text
myList.rating = rateField.text
myList.purchased = purch
myList.notes = Notes.text
//from realm website example
try! realm.write{
realm.add(myList)
}
//from tutorials
//realm.beginWrite()
//realm.add(myList)
//try realm.commitWrite()
}
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
Year.resignFirstResponder()
Price.resignFirstResponder()
}
}
extension RankViewController : UITextFieldDelegate{
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
单独的文件
import Foundation
import RealmSwift
class WineList: Object {
@objc dynamic var vinyard: String?
@objc dynamic var name: String?
@objc dynamic var grape: String?
@objc dynamic var year: String?
@objc dynamic var price: String?
@objc dynamic var notes: String?
@objc dynamic var type: String?
@objc dynamic var rating: String?
@objc dynamic var purchased: String?
}
解决方法
变量仅与创建的函数或类一起存在。因此,采用这两个功能
func getData() {
let realm = Realm()
let results = realm.objects...
}
和
func printData() {
print(results) //this won't work
}
如您所见,var'realm'在getData中实例化,因此var仅在该函数中可用,而在printData函数中不可用。
在您的情况下,您已在viewDidLoad中实例化了领域var
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
因此,它仅在viewDidLoad函数中可用。
要纠正您的问题,您需要在尝试使用它的函数中实例化领域
@IBAction func Submit(_ sender: Any) {
let myList = WineList()
...
let realm = try! Realm()
try! realm.write{
realm.add(myList)
}
对此进行扩展。带上您的RankViewController类
class RankViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
var purch = ""
看到“购买”变量?这就是所谓的“类var”,因为它是在类中的高层定义的,所以整个类都可以使用。
func printData() {
print(self.purch) //this will work
}
请注意,我先购买自我。当我引用它时。对我来说,这很好地表明了它是一个类var,并使代码更具可读性。但是,这不是必需的。