Данные iOS UITextViews сохраняются, даже если я очищаю массив

#ios #arrays #swift #uiviewcontroller #uitextview

#iOS #массивы #swift #uiviewcontroller #uitextview

Вопрос:

На изображении ниже показана графическая иерархия отладки Xcode для UIViewController . Похоже, мне нужно уничтожить дополнительные данные, UITextViews которые воссоздаются после редактирования в массиве UITextViews . Каждый раз, когда я вношу изменения, я устанавливаю для массива значение UITextViews [], а затем воссоздаю его с обновленными данными. Несмотря на то, что я проверяю, что UITextView массив действительно сбрасывается до нулевых элементов, а затем воссоздается с ожидаемым количеством элементов, эти призрачные изображения остаются на экране, и иерархия отладки показывает, что что-то не удаляется.

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

введите описание изображения здесь

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

 var topOfViewFrame: CGFloat = 0
textViewArray = []
for textBlock in textBlocks.textBlocksArray { // a textBlock has formatting data for a UITextView
    let textBlockHeight = CGFloat(textBlock.numberOfLines) * textBlock.blockFontSize
    let viewFrame = CGRect(x: 0, y: topOfViewFrame, width: textBoxWidth, height: textBlockHeight)
    var newTextView = UITextView(frame: viewFrame)
    newTextView.center = CGPoint(x: screenView.frame.width/2, y: topOfViewFrame   (textBlockHeight/2)) // screenView is the 320x240 subView holding the [UITextViews]
    let viewFont = UIFont(name: "AvenirNextCondensed-Medium", size: textBlock.blockFontSize)
    newTextView.font = viewFont
    newTextView.text = textBlock.blockText
    newTextView = configureTextBlockView(textBoxView: newTextView, textBlock: textBlock)
    textViewArray.append(newTextView)
    screenView.addSubview(newTextView) // screenView is the subview holding the [UITextViews]
    topOfViewFrame  = newTextView.frame.height // put the next UITextView directly below the previous one
}
 

Спасибо!

Ответ №1:

Если вы хотите удалить все текстовые представления из «ScreenView», недостаточно просто очистить массив. Вам нужно удалить его из супервизора:

 screenView.subviews.forEach({ $0.removeFromSuperview() })
 

Комментарии:

1. Идеальный. Я только что добавил фильтр, в котором вложенным представлением является UITextView, и это сделало свое дело. Спасибо!