Хранить / отображать данные пользовательского представления внутри UITextView - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь получить редактируемый textView с возможностью встраивания 'Custom View', как показано:

enter image description here

Это представление включает 2 текстовых поля (оно показывает определение слова). view динамически изменяется в зависимости от того, какое определение выбрано. В настоящее время я могу добавить его в textView как NSAttachment как изображение (так как я не могу прикрепить пользовательский view к textView), но если я сделаю это таким образом, у меня не будет никакого способа доступ к тому, что текст внутри пользовательского представления, если мне нужно обновить представление.

Может кто-нибудь дать мне решение, где я мог бы каким-то образом хранить информацию, которая находится в пользовательском представлении? Я хочу убедиться, что в будущем я смогу получить доступ к данным в случае изменения дизайна представления, и я хотел бы обновить его. Нужно ли мне перейти на WebView и каким-то образом создать пользовательский анализ в HTML, который ищет информацию определения и затем форматирует ее?

РЕДАКТИРОВАТЬ: Код, используемый для создания NSAttachment. Функция returnView () возвращает объект просмотра, как показано красным на фотографии выше. Остальная часть viewController - это просто textView, который сохраняет NSAttributedString в Базовый объект данных.

func viewToNSAttachment() {

    let view = returnView()
    view.layoutIfNeeded()

    // Render Image
    let renderer = UIGraphicsImageRenderer(size: view.frame.size)
    let image = renderer.image {
        view.layer.render(in: $0.cgContext)
    }

    // Create Attachment
    let attachment = NSTextAttachment()
    attachment.image = image
    attachment.bounds = CGRect(origin: .zero, size: image.size)

    // Current Attributed String
    let atStr = NSMutableAttributedString(attributedString: textView.attributedText)

    // Insert Attachment
    let attachmentAtStr = NSAttributedString(attachment: attachment)
    if let selectedRange = textView.selectedTextRange {
        let cursorIndex = textView.offset(from: textView.beginningOfDocument, to: selectedRange.start)
        atStr.insert(attachmentAtStr, at: cursorIndex)
        atStr.addAttributes(self.textView.typingAttributes, range: NSRange(location: cursorIndex, length: 1))
    } else {
        atStr.append(attachmentAtStr)
    }
    textView.attributedText = atStr
}
...