AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-205185

Duncan C's questions

Martin Hope
Duncan C
Asked: 2024-12-06 02:50:09 +0800 CST

Como aplicar condicionalmente uma ação de acessibilidade?

  • 5

O SwiftUI tem o prático .accessiblityAction()ViewModider que adiciona uma ação de acessibilidade a uma visualização que você está criando. Usuários de teclado e usuários de VO podem aprender sobre as ações anexadas à Visualização e acioná-las.

Quero poder aplicar condicionalmente uma ação baseada em um booleano. Algo assim:


Button {
    print("Button tapped")
} label: {
    Text("Button title")
}
if addActionToButton.wrappedValue {
    .accessibilityAction(named: "Button action") {
        print("Button action triggered")
    }
}

No entanto, você não pode colocar um ViewModifier accessibilityActiondentro de uma ifdeclaração.

.accessibilityLabeltem uma variante que recebe um isEnabledparâmetro. Quando a condição isEnabled é falsa, ela não aplica o rótulo de acessibilidade:

@State addA11Label: Bool

Button {
    print("Button tapped")
} label: {
    Text("Button title")
}
.accessibilityLabel("Button foo. Double-tap to do stuff.", isEnabled: addA11Label.wrappedValue)

Quero um accessibilityAction isEnabledparâmetro, mas não tenho essa sorte.

Como eu poderia adicionar condicionalmente um accessibilityActionà minha Button(ou outra visualização)?

swiftui
  • 1 respostas
  • 45 Views
Martin Hope
Duncan C
Asked: 2024-03-06 23:02:09 +0800 CST

Como você deve criar uma ferramenta de linha de comando que use o analisador de argumentos rápido?

  • 5

Eu tentei duas abordagens diferentes, cada uma das quais falha de uma maneira diferente:

Abordagem nº 1:

  • Crie uma pasta para o projeto.

No terminal:

  • cd para pasta
  • pacote swift init --type executável
  • pacote fixo.swift

O comando xed abre o arquivo Package.swift como se fosse um projeto Xcode.

Em seguida, tento usar File>add package dependencies do Xcode para adicionar o analisador swift-agrument ao projeto.

Problema: O botão "Copiar dependência" não faz nada.

Abordagem nº 2:

  • No Xcode, selecione Arquivo> novo projeto, ferramenta de linha de comando do Mac OS.
  • Selecione Arquivo>adicionar dependências de pacote.

Problema:

Não é possível encontrar a biblioteca ArugmentParser não carregada: @rpath/ArgumentParser.framework/Versions/A/ArgumentParser

Tentei substituir main.swift por um arquivo chamado .swift que contém um @maindiretório e uma estrutura ParsableCommand. Eu tentei limpar a pasta build.


A única maneira de fazer isso funcionar é criar o pacote com a abordagem nº 1, init do pacote swift, editar o arquivo package.swift e adicionar manualmente as dependências do analisador de argumentos swift. Eu não trabalho muito com SPM, então tenho que me atrapalhar por um longo tempo para descobrir a sintaxe correta e fazê-la funcionar. Isso geralmente leva a vários falsos inícios e erros, além de muita frustração.

Não deveria haver um conjunto simples de etapas "faça A, B e C" que faça isso funcionar sem ter que limpar um monte de erros ou compor manualmente um arquivo SPM Package.swift?

O IDE não deveria me permitir criar uma ferramenta de linha de comando, adicionar o pacote swift-argument-parser e construir minha ferramenta pela primeira vez sem erros?

swift
  • 1 respostas
  • 17 Views
Martin Hope
Duncan C
Asked: 2024-02-03 03:43:29 +0800 CST

Como alterar o campo de foco no fechamento didBecomeKeyNotification da visualização SwiftUI?

  • 5

Estou escrevendo um aplicativo SwifttUI multiplataforma e quero fazer com que a versão Mac defina o campo em foco atual para um campo específico quando o usuário trocar para outro aplicativo e depois voltar para o meu aplicativo. (Para completar, farei a mesma coisa no iOS.)

Para fazer isso, tentei adicionar este código ao init da minha view:

    let      didBecomeKeyNotification: NSNotification.Name =  {
        #if os(macOS)
            return NSWindow.didBecomeKeyNotification
        #else
            return UIApplication.didBecomeKeyNotification
        #endif
    }()

    NotificationCenter.default.addObserver(
        forName: didBecomeKeyNotification,
        object: nil,
        queue: nil) { _ in
            self.pointToFirstInputField()
        }

Where pointToFirstInputField()define o valor de focusedField(uma @FocusStatevar) para o campo de texto que desejo selecionar quando a janela se tornar a janela principal novamente.

No entanto, isso me dá um erro que Escaping closure captures mutating 'self' parameter.

Ok, tentei adicionar uma [weak self]lista de captura ao meu encerramento. Isso me dá um erro de que "'fraco' só pode ser aplicado a tipos de protocolo de classe e vinculados a classe, não a 'WordleView'"

O que faz sentido, já que uma visualização do SwiftUI é uma estrutura - um tipo de valor.

Então, qual é a solução aqui?

Editar:

(Observe que a pergunta "duplicada" vinculada não é duplicada. Não estou usando a versão de notificações que usa um alvo/ação. Estou usando a versão mais recente que fecha. Minha pergunta é sobre como chamar uma função mutante do corpo do meu fechamento.)

Também não me permite usar um grupo de captura para trabalhar com uma variável fraca.

swift
  • 1 respostas
  • 30 Views
Martin Hope
Duncan C
Asked: 2023-12-05 23:38:35 +0800 CST

Uma subclasse vazia de UIAlertController é segura para uso com `appearance(whenContainedInInstancesOf:)`

  • 7

Alguém aqui no SO queria alterar o comportamento dos UIAlertActionbotões em um arquivo específico UIAlertController, mas não em outros. (Eles queriam rótulos de botões multilinhas para um alerta, mas comportamento normal para todos os outros alertas.) ( Aqui está um link para a outra pergunta.)

Se você ler a documentação, UIAlertControllerdiz que

A classe UIAlertController deve ser usada como está e não oferece suporte a subclasses. A hierarquia de visualizações desta classe é privada e não deve ser modificada.

Como experiência, decidi tentar criar uma subclasse vazia e fictícia de UIAlertController, apenas para ter um nome de classe para dar ao método UIAppearanceappearance(whenContainedInInstancesOf:)

A definição da subclasse fictícia é apenas esta:

class FooController: UIAlertController {
}

Isso então me permite usar a declaração

        UILabel.appearance(whenContainedInInstancesOf: [FooController.self]).numberOfLines = 2

e substituir a aparência de UILabels especificamente em instâncias deFooController

Funciona, aparentemente perfeitamente.

Você pode baixar o projeto de amostra do Github aqui .

Quando você cria um vanilla UIAlertController, seus UIAlertActionbotões têm rótulos de linha única normalmente. Quando você cria um FooController, seus UIAlertActionbotões possuem rótulos de múltiplas linhas.

Embora pareça funcionar perfeitamente, estou desconfiado de ir contra uma declaração explícita nos documentos da Apple de não subclassificar UIAlertController.

Quais são os riscos de ignorar essa advertência e usar uma subclasse vazia?

Aqui está o código do meu projeto de exemplo para referência:

import UIKit

class FooController: UIAlertController {
}

class ViewController: UIViewController {
    
    let buttonLabels = [
    """
    Button1
    line2
    """,
    """
    Button2
    line2
    """,
    """
    Button3
    line2
    """
    ]

    @IBAction func handleAlertButton(_ sender: Any) {
        presentAlert(type: UIAlertController.self)
    }
    
    @IBAction func handleFooButton(_ sender: Any) {
        presentAlert(type: FooController.self)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        UILabel.appearance(whenContainedInInstancesOf: [FooController.self]).numberOfLines = 2
    }
    
    func presentAlert(type: UIAlertController.Type) {
        let sheet = type.init(title: type.description(), message: nil, preferredStyle: .actionSheet)
        for buttonTitle in buttonLabels {
            let item = UIAlertAction(title: buttonTitle, style: .default) { (action) in
                print("Button \(buttonTitle) tapped")
            }
            sheet.addAction(item)
        }
        present(sheet, animated: true, completion: nil)
    }
}
  • 1 respostas
  • 28 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve