Обновление текста textView при добавлении объекта в массив без переопределения текста textView предыдущего объекта - PullRequest
0 голосов
/ 23 сентября 2019

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

"object 1"
"object 2"

проблема в том, что каждый раз, когда новый объект добавляется вмассив, перед которым он перезаписывает объект, поэтому он просто показывает:

  "object 2"

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

   struct ObjectData {
   let name: String
   let type: String
   let code: Int
 }

    var updatedObjectArray = [ObjectData]() { didSet {
                self.updateObjectData(object: self.updatedObjectArray)
            }


       func updateObjectData(object: [ObjectData]) {

                for objectData in object {
                      self.ObjectTextView.text = objectData.name
                }
        }

Ответы [ 4 ]

0 голосов
/ 23 сентября 2019

На первый взгляд, вы переопределяете textView.text при каждом запуске этого цикла:

for objectData in object {
    self.ObjectTextView.text = objectData.name
}

Самый простой вариант - создать var и добавить к нему, а затем установить его кактекст textview или используйте .map и .joined в массиве объектов.

1) обновите вышеупомянутое значение до:

var string = ""
for objectData in object {
    objectStrings += objectData.name + "\n"
}
self.ObjectTextView.text = string

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

2) обновите вышеприведенное значение следующим образом:

self.ObjectTextView.text = object.map{$0.name}.joined(separator: "\n")

Это быстрая опция, которая сначала создает массив objectNames, а затем присоединяетсяих с поставляемым разделителем.

0 голосов
/ 23 сентября 2019

В вашем цикле for вы устанавливаете текст в новое значение на каждой итерации, тем самым удаляя изменения вашей последней итерации.Вы можете добавить свои имена к новой строке, а затем установить текст в конце цикла for следующим образом:

func updateObjectData(object: [ObjectData]) {
    var objectStrings = ""
    for objectData in object {
        objectStrings += objectData.name + "\n"
    }
    self.ObjectTextView.text = objectStrings
}

Или более быстрым способом без конечного перевода строки, сопоставив ObjectData с его именем и присоединившись к нему.с новой строкой:

func updateObjectData(object: [ObjectData]) {
    self.ObjectTextView.text = object.map({$0.name}).joined(separator: "\n")
}
0 голосов
/ 23 сентября 2019

Вы присваиваете name свойство объектов в цикле.Вместо этого вам нужно объединить свойства в одну переменную и назначить весь текст.

func updateObjectData(objects: [ObjectData]) {
    let text = objects.map { $0.name }.joined(separator: "\n")
    ObjectTextView.text = text
}
0 голосов
/ 23 сентября 2019

Вы можете просто сделать это так:

func updateObjectData(objects: [ObjectData]) {
   var text: String = ""
   for object in objects {
        text += object.name + "\n"
   }
   self.yourTextView.text = text
}
...