如何在另一个viewController的tableViewCells中显示保存在Realm中的数据?

时间:2018-10-19 10:33:05

标签: ios swift uitableview realm segue

我正在尝试制作一个应用程序,其中一个功能是,在一个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 = "" }

谢谢!

2 个答案:

答案 0 :(得分:0)

致电后

try! realm.write {
realm.add(NewPerson)
}

您已经保存在领域中,因此您不必在可以通过调用下一个视图控制器的领域中检索的segue上传递此消息

realm.objects(ofType: NewPerson.self)

这将返回NewPerson的数组,或者您也可以使用主键仅搜索一个

realm.object(ofType: NewPerson.self, forPrimaryKey: yourKey)

答案 1 :(得分:0)

老实说,这个问题有点笼统。您要的是几件事。而且,如果我要为您编写实现,我将不会回答您实际需要解决的问题。我想您要问的是:

  1. 如何从领域写入和检索数据。
  2. 如何构造用于在视图之间传递数据的代码。

所以我的建议是这个。

不要通过数据传递数据。创建一个将访问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
    }

}