小编Mal*_*ito的帖子

SwiftUI:菜单打开时如何忽略背景上的点击?

我目前正在努力解决 SwiftUI 问题:

以非常抽象的方式,这就是我的应用程序的代码的样子(不是这里讨论的实际代码):

struct SwiftUIView: View {

    @State private var toggle: Bool = true

    var body: some View {
        VStack {
            Spacer()
            if toggle {
                Text("on")
            } else {
                Text("off")
            }
            Spacer()
            Rectangle()
                .frame(height: 200)
                .onTapGesture { toggle.toggle() }
            Spacer()
            Menu("Actions") {
                Button("Duplicate", action: { toggle.toggle() })
                Button("Rename", action: { toggle.toggle() })
                Button("Delete", action: { toggle.toggle() })
            }
            Spacer()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么这里的本质是什么?

  • 背景中有一个元素(矩形)对用户的点击输入做出反应
  • 有一个菜单,其中包含点击时也会执行某些操作的项目

现在,我面临以下问题:

当通过点击“操作”打开菜单时,菜单将打开 - 到目前为止一切顺利。但是,当我现在决定不想触发菜单中包含的任何操作并点击背景上的某个位置将其关闭时,我可能会点击背景中的矩形。如果这样做,点击矩形将直接触发 onTapGesture 中定义的操作。

但是,所需的行为是当菜单打开时,我可以点击菜单外的任何位置将其关闭,而不会触发任何其他元素。

知道我该如何实现这一目标吗?谢谢!

(如果需要进一步说明,请在评论中告诉我。)

menu ios swift swiftui

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

SwiftUI:有什么方法可以将自定义按钮样式添加到 Menu() 中吗?

我已经尝试了很长一段时间向 SwiftUI Menu() 的标签添加自定义按钮样式/行为,但到目前为止还没有取得任何成功。这是我想要实现的目标的示例:

自定义按钮样式

假设我有一个自定义按钮样式,可以让按钮的文本在按下时变为红色。

struct RedButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .foregroundColor(configuration.isPressed ? .red : .primary)
}
Run Code Online (Sandbox Code Playgroud)

菜单

另外,我有一个标准的 SwiftUI 菜单。

Menu("Menu button", content: {
    // Some menu content goes here
})
Run Code Online (Sandbox Code Playgroud)

在此配置中,SwiftUI 菜单以强调色(系统蓝色)显示一个标准按钮,其行为类似于标准按钮(按下时变灰)。按下后,菜单将按预期显示。

自定义菜单按钮

现在我想以某种方式将自定义按钮样式应用到菜单正在使用的按钮。我尝试的是以下内容:

Menu(content: {
    // Some menu content goes here
}, label: {
    Button("Menu button", action: { })
        .buttonStyle(RedButtonStyle())
})
Run Code Online (Sandbox Code Playgroud)

然而,菜单按钮的行为根本没有改变——按下时它仍然只是变灰,而不是变成红色。

我还尝试了创建自定义菜单样式,但到目前为止还没有取得任何成功。

对此有何建议?谢谢!

menu button styling swift swiftui

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

在哪里放置 .register() 方法来设置 UserDefaults 的初始/默认值?

我目前正在努力找出正确放置 .register() 方法的位置,以设置 UserDefaults 的初始/默认值(在应用程序的每次启动时)。

这是我尝试在 Xcode 随项目生成的“App”文件中初始化它的地方:

import SwiftUI

@main
struct TestApp: App {

    init() {
        //Sets default values for the user defaults that have not yet been set and should not return 0/false
        UserDefaults.standard.register(defaults: [
                "selectedRoundLength": 1
            ]
        )
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎并没有真正起作用。有人对此有意见吗?

ios userdefaults swiftui

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

SwiftUI:使用 MFMailComposeViewController 发送电子邮件

我目前正在尝试使用 SwiftUI 生命周期并针对 iOS 14 在我的 SwiftUI 应用程序中实现“发送电子邮件”按钮。

我知道网上有很多解决方案 - 这里是堆栈溢出和其他地方。但是,到目前为止,我还无法在模拟器/设备上进行任何操作。

我当前的解决方案如下所示(基于stackoverflow 上的这个问题

import SwiftUI
import MessageUI
import Foundation

struct ContentView: View {

    class MailComposeViewController: UIViewController, MFMailComposeViewControllerDelegate {
    
        static let shared = MailComposeViewController()
    
        func sendEmail() {
            if MFMailComposeViewController.canSendMail() {
                let mail = MFMailComposeViewController()
                mail.mailComposeDelegate = self
                mail.setToRecipients(["test@test.com"])

                UIApplication.shared.windows.last?.rootViewController?.present(mail, animated: true, completion: nil)
            } else {
                // Alert
            }
        }
    
        func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
            controller.dismiss(animated: true, completion: nil)
        }
    }
    
    var body: some …
Run Code Online (Sandbox Code Playgroud)

email message ios swift swiftui

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

Firebase Analytics (iOS):如何在 Xcode 模拟器中运行应用程序时停用事件日志记录?

我现在花了一些时间,试图找出在 Xcode 模拟器中运行应用程序时如何停用 Firebase Analytics for iOS 中的事件日志记录。

目前我已经按照 Google 文档中的描述设置了 Firebase。问题是,即使我在 Xcode 的模拟器/测试设备上运行我的应用程序,Firebase Analytics 似乎也会记录事件。这与我在 Firebase 控制台中看到的统计数据相混淆。

谁能帮我提供有关如何防止这种行为的信息?

提前致谢!

logging ios firebase swift firebase-analytics

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

SwiftUI:在 Xcode 12/iOS 14 中使用环境对象(--> 如何/在环境中放置对象?)

在编写我的第一个 iOS 应用程序的过程中,我遇到了一个新问题,到目前为止我无法找到解决方案:我想使用环境对象将信息传递到各种视图。

我知道对此有很多解释和教程(例如,在 hackingwithswift.com 上:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data- Between-意见

然而,所有这些教程似乎都在使用“场景委托”,根据我目前的理解,Xcode 12 中不存在这种委托。

因此,我正在努力解决如何/在哪里放置环境对象在我的应用程序环境中以及如何将其连接到我的内容视图/其他视图。

这段代码应该放在哪里?它会进入内容视图吗?

class UserSettings: ObservableObject {
@Published var score = 0
}
Run Code Online (Sandbox Code Playgroud)

有人能帮忙解决这个问题吗?我会很感激 :)

swiftui environmentobject ios14 xcode12

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

SwiftUI:如何让用户使用“亮”、“暗”和“系统”选项实时设置应用程序外观?

我目前正在尝试在应用程序中实现一个解决方案,用户应该能够使用以下选项实时切换应用程序的外观:

  • 系统(应用在设备的 iOS 设置中设置的任何外观)
  • Light(应用 .light 配色方案)
  • 深色(应用 . 深色配色方案)

事实证明,使用 .preferredColorScheme() 设置浅色和深色配色方案非常容易且响应迅速;但是,对于“系统”选项,我还没有找到任何令人满意的解决方案。

我目前的方法如下:

  1. 在 ContentView 中使用 @Environment(.colorScheme) 获取设备配色方案
  2. 创建自定义视图修改器以在任何视图上应用相应的配色方案
  3. 使用“MainView”上的修饰符(这是应用程序的真实内容应该存在的地方)在配色方案之间切换

我的想法是在 ContentView 中嵌入 MainView,这样@Environment(.colorScheme) 就不会被任何应用于 MainView 的 colorScheme 所干扰。

但是,它仍然没有按预期工作:设置明暗外观时,一切都按预期工作。但是,当从亮/暗切换到“系统”时,外观的变化只有在重新启动应用程序后才能看到。然而,预期的行为是外观立即改变。

对此有何想法?

以下是相关的代码片段:

主视图

import SwiftUI

struct MainView: View {

    @AppStorage("selectedAppearance") var selectedAppearance = 0

    var body: some View {
        VStack {
            Spacer()
            Button(action: {
                selectedAppearance = 1
            }) {
                Text("Light")
            }
            Spacer()
            Button(action: {
                selectedAppearance = 2
            }) {
                Text("Dark")
            }
            Spacer()
            Button(action: {
                selectedAppearance = 0
            }) { …
Run Code Online (Sandbox Code Playgroud)

color-scheme ios swift swiftui ios-darkmode

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