我正在尝试制作一个应用程序,其中一个功能是,在一个viewController中,用户可以输入有关给定人员的一些数据(照片,姓名和特定问题的答案)。当按下“保存新人员按钮”时,用户将被重定向到先前的viewController,该viewController除其他外还拥有一个tableView。
在此tableView中,我希望每次用户在另一个viewController中按下“保存新人按钮”时都创建一个新单元格。当然,牢房应带有该人的名字(最好是照片的缩影)。
现在,重要的是数据必须“内部”存储-甚至在退出某个viewController或关闭应用程序之后也是如此。因此,我将Realm用作数据库来存储所有数据。
在使用Realm方面我是一个非常新的人,所以也许我的问题看起来很愚蠢。基本上,我认为我已经能够使“保存新人按钮”将所有数据保存在领域数据库中。但是,当试图使该按钮在先前的viewController中创建新的单元格(必须保留,一旦创建!)……会发生各种奇怪的事情!
下面的代码显示的是我当前尝试通过segue传递至少一个名称,但这会产生一些问题:单元格不存在。如果您尝试添加一个新的单元格,它只会覆盖旧的单元格。最后,PeopleData.count显然会计算名称中字母的数量-并创建fx。 5个相同的单元格组成一个5个字母的长名称! :D
我确定这不是传递数据的正确方法...那么呈现此数据的最佳方法是什么?这样,单元一旦创建便会保留-以便用户可以添加多个新人员/几个新单元,而不会覆盖旧单元!
相关代码:
viewController,用户可以在其中输入数据:
@IBAction func SaveNewPerson() {
let NewPerson = person()
NewPerson.name = PersonName.text!
NewPerson.answer = PersonAnswer.text!
NewPerson.extraIdentifier = PersonExtraIdentifier.text!
let realm = try! Realm()
try! realm.write {
realm.add(NewPerson)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// let allPeople = realm.objects(person.self)
let SomePersonName = PersonName.text!
if segue.identifier == "PassingSomeInfo" {
if let vc = segue.destination as? AllPersonsInYourDiary {
vc.PeopleData = SomePersonName
}
}
带有tableView的Viewcontroller:
var PeopleData: ""
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return PeopleData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Person1", for: indexPath)
cell.textLabel?.text = self.PeopleData
cell.textLabel?.numberOfLines = 0
cell.textLabel?.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
return cell
}
第三viewController(用于存储所有人员数据):
class person: Object {
@objc dynamic var name = ""
@objc dynamic var answer = ""
@objc dynamic var extraIdentifier = "" }
谢谢!
答案 0 :(得分:0)
致电后
try! realm.write {
realm.add(NewPerson)
}
您已经保存在领域中,因此您不必在可以通过调用下一个视图控制器的领域中检索的segue上传递此消息
realm.objects(ofType: NewPerson.self)
这将返回NewPerson
的数组,或者您也可以使用主键仅搜索一个
realm.object(ofType: NewPerson.self, forPrimaryKey: yourKey)
答案 1 :(得分:0)
老实说,这个问题有点笼统。您要的是几件事。而且,如果我要为您编写实现,我将不会回答您实际需要解决的问题。我想您要问的是:
所以我的建议是这个。
不要通过数据传递数据。创建一个将访问Realm并检索该视图所需数据的类。将其命名为Database,Realm或LocalStorage。
在该类中,添加用于写入Realm以及从Realm检索的方法。您可以在Realm文档中找到方法:https://realm.io/docs/swift/latest/
在您需要显示条目的视图中,实例化您的Realm类。一些伪代码可以帮助您:
class ViewController {
fileprivate let database = LocalStorage()
fileprivate var peopleData: [People]()
viewDidLoad() {
super.viewDidLoad()
database.retrieveData(primaryKey: "extraIdentifier", completionHandler: { entries, err in
if err == nil {
self.peopleData = entries
}
})
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return peopleData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let person = self.peopleData[indexPath.item]
let cell = tableView.dequeueReusableCell(withIdentifier: "Person1", for: indexPath)
cell.textLabel?.text = person.name
cell.textLabel?.numberOfLines = 0
cell.textLabel?.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
return cell
}
}