Как представить данные, сохраненные в Realm, в таблице viewCells другого viewController? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать приложение, в котором одна из функций состоит в том, чтобы в одном viewController пользователь мог вводить некоторые данные о данном человеке (фотографию, имя и ответ на определенный вопрос).При нажатии кнопки «Сохранить нового человека», пользователь должен быть перенаправлен на предыдущий viewController, который, помимо прочего, содержит tableView.

В этом табличном представлении я хочу создать новую ячейку каждый раз, когда пользователь нажимает кнопку «Сохранить нового человека» в другом viewController.Ячейка должна, конечно, содержать имя человека (и в идеале также миниатюру фотографии).

Теперь важно, чтобы данные сохранялись «внутри» - также после выхода из определенного viewController или закрытия приложения.Поэтому я использую Realm в качестве базы данных для хранения всех данных.

Я очень новичок в использовании Realm, поэтому, возможно, мои вопросы кажутся глупыми.По сути, я думаю, что мне удалось заставить «Сохранить нового человека кнопку» сохранить все данные в базе данных области.Но при попытке заставить кнопку создать новые ячейки (которые должны остаться, когда-то созданные !!) в предыдущем viewController ... Все виды странных вещей случаются!

То, что показано под кодом, является моей текущей попыткой передать хотя бы имя через segue, но это создает несколько проблем: ячейки не остаются.Если вы попытаетесь добавить новую ячейку, она просто переопределит старую.И, наконец, PeopleData.count, по-видимому, считает количество букв в имени и создает fx.5 одинаковых ячеек для длинного имени из 5 букв!: D

Я уверен, что это не правильный способ передачи данных ... Так, каков наилучший способ представить эти данные?Чтобы ячейки оставались однажды созданными - и чтобы пользователь мог добавить несколько новых людей / несколько новых ячеек, не переопределяя старые!

Соответствующий код:

viewController, где пользователь может ввестиdata:

@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
        }
    }

Viewcontroller с таблицей ViewView:

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 голосов
/ 19 октября 2018

Этот вопрос, честно говоря, немного широк.То, что вы просите, - это несколько вещей одновременно.И если бы я написал для вас реализацию, я бы не ответил на ваш вопрос о том, что вам нужно делать.Я думаю, что вы спрашиваете это:

  1. Как мне писать и получать данные из области.
  2. Как мне структурировать мой код для передачи данных между представлениями.

Так что я рекомендую следующее.

Не передавайте данные с помощью segue.Создайте класс, который будет обращаться к 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
    }

}
0 голосов
/ 19 октября 2018

После того, как вы позвоните

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

, вы уже сохранили в области, поэтому вам не нужно передавать это в запрос, который можно получить из области на следующем контроллере представления, вызвав

realm.objects(ofType: NewPerson.self)

Это вернет массив NewPerson, или вы также можете искать только один с вашим первичным ключом

realm.object(ofType: NewPerson.self, forPrimaryKey: yourKey)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...