A entrada de texto multilinha atualmente não tem suporte nativo no SwiftUI (espero que esse recurso seja adicionado em breve!), Então estou tentando usar a estrutura de combinação para implementar um UITextView do UIKit que oferece suporte a entrada multilinha, no entanto, tenho obtido resultados mistos .
Este é o código que criei para tornar a visualização de texto:
struct MultilineTextView: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UITextView {
let view = UITextView()
view.isScrollEnabled = true
view.isEditable = true
view.isUserInteractionEnabled = true
view.backgroundColor = UIColor.white
view.textColor = UIColor.black
view.font = UIFont.systemFont(ofSize: 17)
view.delegate = context.coordinator
return view
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
}
func frame(numLines: CGFloat) -> some View {
let height = UIFont.systemFont(ofSize: 17).lineHeight * numLines
return self.frame(height: height)
}
func makeCoordinator() -> MultilineTextView.Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextViewDelegate {
var parent: MultilineTextView
init(_ parent: MultilineTextView) {
self.parent = parent
}
func textViewDidChange(_ textView: UITextView) {
parent.text = textView.text
}
}
}
Em seguida, implementei em uma visualização swiftUI como:
MultilineTextView(text: title ? $currentItem.titleEnglish : $currentItem.pairArray[currentPair].english)//.frame(numLines: 4)
E vinculou a uma variável de estado:
@State var currentItem:Item
Isso meio que funciona. No entanto, o estado var currentItem: Item contém uma matriz de strings que estou então percorrendo usando botões que atualizam a matriz de string com base no que foi inserido em MultilineTextView. É aqui que estou encontrando um problema em que MultilineTextView parece se vincular apenas ao primeiro item da string na matriz e, em seguida, não muda. Quando eu uso a visualização TextField nativa do swiftUI, essa funcionalidade funciona bem e posso percorrer a matriz de strings e atualizá-la inserindo texto no TextField.
Acho que deve estar faltando algo na estrutura MultilineTextView para permitir essa funcionalidade. Quaisquer sugestões são recebidas com gratidão.
Atualização: Estruturas de modelo adicionadas
struct Item: Identifiable, Codable {
let id = UUID()
var completed = false
var pairArray:[TextPair]
}
struct TextPair: Identifiable, Codable {
let id = UUID()
var textOne:String
var textTwo:String
}
Edit: Então, eu fiz mais algumas escavações e descobri o que acho que é o problema. Quando o textViewDidChange do UITextView é acionado, ele envia o texto atualizado que posso ver no console. O estranho é que a função updateUIView também é acionada e atualiza o texto do UITextView com o que estava na vinculação var antes de a atualização ser enviada via textViewDidChange. O resultado é que o UITextview simplesmente se recusa a mudar quando você digita nele. O estranho é que funciona para a primeira String no array, mas quando o item é alterado, ele não funciona mais.
Parece que o SwiftUI cria duas variantes de UIViewRepresentable, para cada ligação, mas não as altera quando estado, ou seja, titleé alternado ... provavelmente devido a defeito, vale a pena enviar para a Apple.
Eu encontrei uma solução alternativa (testado com Xcode 11.2 / iOS 13.2), use visões explicitamente diferentes como abaixo
if title {
MultilineTextView(text: $currentItem.titleEnglish) } else { MultilineTextView(text: $currentItem.pairArray[currentPair].textOne)
}
Então descobri o problema no final, a razão pela qual não estava atualizando era porque eu estava passando uma string que estava localizada com DUAS variáveis de estado. Você pode ver que na linha seguinte, currentItem é uma variável de estado, mas currentPair é outra variável de estado que fornece um número de índice para localizar uma string. Este último não estava sendo atualizado porque também não estava sendo passado para a visualização de texto multilinha por meio de uma vinculação.
MultilineTextView(text: title ? $currentItem.titleEnglish : $currentItem.pairArray[currentPair].english)
Eu pensei inicialmente que passar em um seria bom e a visão pai lidaria com o outro, mas acabou não sendo o caso. Resolvi meu problema criando duas variáveis de ligação para que pudesse localizar a string desejada de maneira dinâmica. Parece estúpido agora, mas não consegui ver na hora.
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.