#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, и это сделало свое дело. Спасибо!