小编Art*_*uro的帖子

访问未安装在视图上的 StateObject 对象。这将每次创建一个新实例 - SwiftUI

每次应用程序启动时我都必须进行一些初始设置,但我收到错误:

在此输入图像描述

错误很明显,答案却不是。我尝试将 init 放入子视图中,但我不能,它需要位于 root 中@main。我是这样定义的:

@StateObject private var amplifyConfig: AmplifyConfig = AmplifyConfig()

init() {
    if(amplifyConfig.isAmplifyConfigured == false) {
        amplifyConfig.dataStoreHubEventSubscriber()
        amplifyConfig.configureAmplify()
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何摆脱该警告并实际实现它,这样它就不会创建多个实例,这就是我使用 @EnvironmentObject 的原因?

swift swiftui

54
推荐指数
2
解决办法
3万
查看次数

无法推断通用参数“T” - Swift 5.5

我试图让用户登录,但收到以下错误:

Generic parameter 'T' could not be inferred
Run Code Online (Sandbox Code Playgroud)

这是代码:

// Gets User signed-in
func getUser() async throws -> AuthUser {
    do {
        try await withUnsafeThrowingContinuation { continuation in
            if let user = Amplify.Auth.getCurrentUser() {
                continuation.resume(returning: user )
            }
        }
    } catch(let error) {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?

swift aws-amplify swiftui

11
推荐指数
1
解决办法
5118
查看次数

iOS Github Actions(构建、测试和部署)

我正在尝试使用 github actons 制作一个简单的工作流程,因此当我将例如推送到我的主分支时,它会macOS-latest在OS 12.4, iPhone 11 Pro Max. 因为很新,教程不全,谁能借我一下?

这就是我现在所拥有的:

name: StyleOn_Workflow

on: [push]

jobs:
  build:

    runs-on: macOS-latest
    strategy:
      matrix:
        destination: ['platform=iOS Simulator,OS=12.4,name=iPhone 11 Pro Max']

    steps:
    - uses: actions/checkout@master
    - name: Build
      run: swift build -v

  test:
      name: Test
      runs-on: macOS-latest
      strategy:
          matrix:
            destination: ['platform=iOS Simulator,OS=12.4,name=iPhone 11 Pro Max']
      steps:
        - name: Checkout
          uses: actions/checkout@master
        - name: Run tests
          run: swift test -v
Run Code Online (Sandbox Code Playgroud)

此外,由于我没有将应用程序部署到应用程序商店,我该如何进行部署阶段?也许将它合并到主分支?我需要有 3 个阶段,构建、测试和部署

这是我得到的错误:

在此处输入图片说明

github ios github-actions github-actions-services

9
推荐指数
1
解决办法
1772
查看次数

将 Alamofire 完成处理程序转换为异步/等待 | 斯威夫特 5.5,*

我有当前有效的功能。我将它与完成处理程序一起使用:

func getTokenBalances(completion: @escaping (Bool) -> Void) {
    guard let url = URL(string: "someApiUrlFromLostandFound") else {
        print("Invalid URL")
        completion(false)
        return
    }
    
    AF.request(url, method: .get).validate().responseData(completionHandler: { data in
        do {
            guard let data = data.data else {
                print("Response Error:", data.error as Any)
                completion(false)
                return
            }
            
            let apiJsonData = try JSONDecoder().decode(TokenBalanceClassAModel.self, from: data)
            DispatchQueue.main.async {
                self.getTokenBalancesModel = apiJsonData.data.items
                completion(true)
            }
        } catch {
            print("ERROR:", error)
            completion(false)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

如何将其转换为 swift 5.5 的新 async/await 功能?

这是我尝试过的:

func getTokenBalances3() async {
    let url …
Run Code Online (Sandbox Code Playgroud)

swift alamofire alamofire-request swiftui alamofire5

7
推荐指数
2
解决办法
1万
查看次数

带有小时和分钟的选择器 SwiftUI

我有以下内容:

DatePicker("Time between meals", selection: $time, displayedComponents: .hourAndMinute)
Run Code Online (Sandbox Code Playgroud)

但我需要显示的不是日期,而是一个轮子来选择我想要的小时和分钟,正如变量所说,对于两餐之间的时间,假设是 3 小时和 2 分钟,而不是晚上 7:00。我怎样才能做到这一点?

这就是我需要的:

在此输入图像描述

谢谢

swift swiftui

5
推荐指数
1
解决办法
5971
查看次数

将文本内的 html 链接转换为可点击链接 - SwiftUI

有没有最新的方法来转换文本内的链接?我从 API 中获取此类文本:

var someText: String = "with banks (for example to the sometimes controversial but leading exchange <a href="https://www.coingecko.com/en/exchanges/bitfinex">Bitfinex</a>)."
Run Code Online (Sandbox Code Playgroud)

如何将该链接转换为具有正确名称的可点击链接(在上面的示例中:Bitfinex)?

文本可以包含多个链接。SwiftUI 现在支持 markdown,手动我可以这样做:

Text("[Privacy Policy](https://example.com)")
Run Code Online (Sandbox Code Playgroud)

但是我该如何处理从 api 接收到的带有多个链接的文本呢?

寻找 Swift 5 和 SwiftUI 3 解决方案。

swift swiftui

5
推荐指数
1
解决办法
2353
查看次数

从当前用户 firebase swift 获取文档

我正在尝试从中获取名字: 在此处输入图片说明

用户已登录,我可以访问他的 uid,但我无法获取属于该用户的文档,这就是我尝试这样做的方式:

    private func getDocument() {

        var userID = Auth.auth().currentUser?.uid
            userID = String(userID!)

        var currentUser = Auth.auth().currentUser


//         Get sspecific document from current user
        let docRef = db.collection("users").document("bnf2s3RURUSV2Oecng9t")

        // Get data
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
                print("Document data: \(dataDescription)")
            } else {
                print("Document does not exist")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您注意到,如果我手动输入“bnf2s3RURUSV2Oecng9t”,它将访问数据,但关键是要能够知道“bnf2s3RURUSV2Oecng9t”是什么,以便我可以将它放在上面的硬编码变量上。我的最终目标是能够获取当前用户的名字:)

firebase swift firebase-authentication firebase-realtime-database google-cloud-firestore

4
推荐指数
1
解决办法
1680
查看次数

使用异步函数初始化应用程序 | 斯威夫特用户界面

我需要我的应用程序在启动时配置后端,这是执行此操作的函数:

// Initializes Amplify
final func configureAmplify() async {
    do {
//            Amplify.Logging.logLevel = .info
        let dataStore = AWSDataStorePlugin(modelRegistration: AmplifyModels())
        let syncWithCloud = AWSAPIPlugin()
        let userAuth = AWSCognitoAuthPlugin()

        try Amplify.add(plugin: userAuth)
        try Amplify.add(plugin: dataStore)
        try Amplify.add(plugin: syncWithCloud)
        try Amplify.configure()
        print("Amplify initialized")
    } catch {
        print("Failed to initialize Amplify with \(error)")
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试将它放在 @main init 中,如下所示:

init() async {
    await networkController.configureAmplify()
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Type 'MyApplicationNameApp' does not conform to protocol 'App'
Run Code Online (Sandbox Code Playgroud)

我尝试在初始化它之后应用建议:

init() {
        
}
Run Code Online (Sandbox Code Playgroud)

但这看起来很奇怪,所以现在我有 2 个 init。这里发生了什么以及在应用程序启动时初始化多个异步函数的正确方法是什么,例如:

  1. 上面的代码(配置放大) …

swiftui swiftui-environment

4
推荐指数
1
解决办法
6574
查看次数

删除文本编辑器上的填充

下面是我的自定义文本编辑器,一旦您单击笔进行编辑,就会出现一个新空间,因此之前的文本与新文本不在同一行。我怎样才能解决这个问题?这是一个简单的可重现示例:

struct SwiftUIView: View {
    
    @State var name: String = "test"
    @State var showEdit: Bool = true
    
    var body: some View {
        HStack {
            HStack {
                if(showEdit) {
                    CustomTextEditor.init(placeholder: "My unique name", text: $name)
                        .font(.headline)
                } else {
                    Text(name)
                        .font(.headline)
                }
            }
            
            Spacer()
            
            Button(action: {
                showEdit.toggle()
            }) {
                Image(systemName: "pencil")
                    .foregroundColor(.secondary)
            }
        }
    }
}

struct CustomTextEditor: View {
    let placeholder: String
    
    @Binding var text: String
    
    var body: some View {
        ZStack {
            if text.isEmpty  {
                Text(placeholder)
                    .foregroundColor(Color.primary.opacity(0.25))
            }
            TextEditor(text: …
Run Code Online (Sandbox Code Playgroud)

swift swiftui

4
推荐指数
1
解决办法
2567
查看次数

使用默认电子邮件提供商发送电子邮件 - SwiftUI

通过在设置中设置默认邮件应用程序的新选项,我想知道是否有更简单的发送电子邮件的解决方案。现在我正在使用手动解决方案手动添加第三方应用程序,如下所示:

...
if MFMailComposeViewController.canSendMail() {
    self.settingsViewModel.showingFeatureEmail.toggle()
} else if let emailUrl = self.settingsViewModel.createEmailUrl(to: self.generalConstants.email, subject: "Feature request! [\(self.generalConstants.appName)]", body: "Hello, I have this idea ") {
    UIApplication.shared.open(emailUrl)
} else {
    self.settingsViewModel.showMailFeatureAlert = true
}
...

func createEmailUrl(to: String, subject: String, body: String) -> URL? {
    let subjectEncoded = subject.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
    let bodyEncoded = body.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

    let gmailUrl = URL(string: "googlegmail://co?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
    let outlookUrl = URL(string: "ms-outlook://compose?to=\(to)&subject=\(subjectEncoded)")
    let yahooMail = URL(string: "ymail://mail/compose?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
    let sparkUrl = URL(string: "readdle-spark://compose?recipient=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")

    if let gmailUrl = gmailUrl, …
Run Code Online (Sandbox Code Playgroud)

swift

3
推荐指数
1
解决办法
1071
查看次数

无法识别文件格式_ *

我需要处理一个文件并且它正在工作,但是我需要更改文件模式。这是需要的:someText_XYZ_*.dat

我添加了星号,因此_接受之后的所有内容,但是不接受具有该名称的文件:someText_XYZ_abc1.dat

模式存储在Oracle表中。当我运行应用程序时,将读取表,并使用文件模式来匹配文件名(可能在Apache Camel中)。当前有效的示例是:.*.csv和[0-9]{7}.abc.*.csv

我的新模式有什么问题?

regex

1
推荐指数
1
解决办法
62
查看次数

播放提醒声音 SwiftUI

我知道我可以从自己的库中播放声音,例如: 如何使用 Swift 播放声音?

但如何使用 iPhone 已有的默认提醒声音呢?只需按一下简单的按钮即可将其置于上下文中?

谢谢

avfoundation swift swiftui

0
推荐指数
1
解决办法
2909
查看次数

在字符串中的第一个字母后添加一个空格 - Swift 5

我有一个字符串:$271.65,如何$以最原生的方式在之后添加一个空格?我正在使用 SwiftUI

我尝试了该属性,.kerning(10)但在每个字符后增加了空格,我只想要第一个。

谢谢

swift

0
推荐指数
1
解决办法
77
查看次数