小编Geo*_*e_E的帖子

NavigationView 栏材质在 iOS 15 上不可见

NavigationView在 iOS 15 上,具有with模式的应用程序.inline不再显示您在导航栏上看到的模糊材质颜色。

示例代码:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.ignoresSafeArea()
                
                Text("Content")
            }
            .navigationBarTitleDisplayMode(.inline)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

比较:

iOS 14.4 iOS 15
iOS 14.4 结果 iOS 15 结果

如何修复此问题以保持 iOS 14 的行为?

swift swiftui swiftui-navigationview

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

在 SwiftUI 中使用 TabView 时,第一个选项卡栏按钮出现两次

正如您从屏幕截图中看到的,“语言”选项卡出现了两次。

第一个 TabView 选项卡出现两次

我有以下 HostingTabBar 代码,该代码在应用程序启动时调用:


struct HostingTabBar: View {
    
    private enum Tab: Hashable {
        case language
        case canvas
        case homework
        case test
        case more
    }
    
    @State private var selectedTab: Tab = .language
    
    var body: some View {
        TabView(selection: $selectedTab) {
        LanguageView()
            .tag(0)
            .tabItem {
                Text("Language")
                Image("language")
            }
        CanvasView()
            .tag(1)
            .tabItem {
                Text("Canvas")
                Image("canvas")
            }
        HomeworkView()
            .tag(2)
            .tabItem {
                Text("Homework")
                Image("homework")
            }
        TestView()
            .tag(3)
            .tabItem {
                Text("Test")
                Image("test")
            }
        MoreView()
            .tag(4)
            .tabItem {
                Text("More")
                Image("more")
            }
        }
        .accentColor(nil)
    }
}

struct HostingTabBar_Previews: …
Run Code Online (Sandbox Code Playgroud)

tabbar tabview swift swiftui

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

SwiftUI 工具栏被键盘附件视图覆盖

您好,我在 Xcode 12.4 (iOS 14) 中使用 SwiftUI 需要解决一个棘手的问题:假设我有Form许多部分和TextEditors,此表单具有.toolbar带有一些内容(本例中为按钮)的修饰符(底部栏)。所有的一切都被包裹在里面NavigationView。一旦用户单击其中之一TextEditor,底部工具栏就会被键盘的系统附件视图覆盖。请注意,我根本不修改安全区域。任何人都知道下面的代码有什么问题吗?

struct ContentView: View {
    @State var narrative: String = ""

    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Test 1")) {
                    Text("Bla Bla Bla")
                }
                Section(header: Text("Test 2")) {
                    Text("Bla Bla Bla")
                }
                Section(header: Text("Test 3")) {
                    Text("Bla Bla Bla")
                }
                Section(header: Text("Test 4")) {
                    Text("Bla Bla Bla")
                }
                Section(header: Text("Test 5")) {
                    Text("Bla Bla Bla")
                }
                Section(header: …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-form swiftui-navigationview

6
推荐指数
0
解决办法
451
查看次数

实时事件的数量超过实时事件计数每日限制.事件不再是实时的

当我在日志中收到这些消息时,有什么需要担心的吗?

在此输入图像描述

2018-09-02 21:27:09.723503+0100 Songvote[1775:490365] 4.12.0 - [Firebase/Analytics][I-ACS023104] Number of real-time events is over the real-time event count daily limit. Event is no longer real-time. Event name, parameters: _vs, {
    "_c" = 1;
    "_o" = auto;
    "_pc" = CodeViewController;
    "_pi" = 1971604679964194266;
    "_sc" = UserViewController;
    "_si" = 1971604679964194267;
}

2018-09-02 21:27:09.723620+0100 Songvote[1775:490365] 4.12.0 - [Firebase/Analytics][I-ACS023104] Number of real-time events is over the real-time event count daily limit. Event is no longer real-time. Event name, parameters: _vs, {
    "_c" = 1;
    "_o" …
Run Code Online (Sandbox Code Playgroud)

google-analytics ios firebase swift firebase-analytics

5
推荐指数
0
解决办法
973
查看次数

SwiftUI Sheet 不更新变量

如果我通过选择另一个项目来更改值,我会尝试将一个项目传递到工作表。即使我从未使用第一项调用工作表,工作表仍会继续显示第一项。

这是一个错误还是我做错了什么?

锻炼列表.swift

import SwiftUI

struct WorkoutList: View {
    private var workouts = workoutData
    @State var showWorkoutDetails = false

    var body: some View {
        ScrollView(.horizontal, showsIndicators: false) {
            HStack(spacing: 20) {
                ForEach(workouts) { workoutCard in
                    GeometryReader { geometry in
                        Button(action: {self.showWorkoutDetails.toggle()}) {
                            WorkoutCardView(workout: workoutCard)
                                .rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0))
                                .sheet(isPresented: self.$showWorkoutDetails) {
                                    WorkoutDetails(workout: workoutCard)
                                }
                        }
                    }
                    .frame(width:246, height: 360)

                }
            }
        .padding(30)
        }
    }
}

private let workoutData = [ …
Run Code Online (Sandbox Code Playgroud)

swift swiftui

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

拖放在 macOS 上不起作用,但在 iOS 上起作用(使用 Catalyst)

onDrag使用SwiftUI进行拖放onDrop在 iOS 设备上效果非常好。然而,对于 macOS,我什至根本无法拖动视图。

对于 iOS 来说它可以工作,对于 macOS 则不行,这看起来很奇怪。该应用程序是使用 Catalyst 制作的,目标为 iOS 13.4。

即使对于一些基本的东西,它也适用于其中一个而不是另一个:

struct ContentView: View {

    var body: some View {
        Text("Hello World!")
            .onDrag { NSItemProvider(object: "Hello 2" as NSString) }
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?这是一个错误吗?

macos ios swift swiftui mac-catalyst

5
推荐指数
0
解决办法
1224
查看次数

navigationBarHidden() 在 iOS 15 Beta SwiftUI 中不起作用

我试图隐藏第三个选项卡上的导航栏,但对于其余选项卡,它应该显示。它在 iOS 14 中工作正常,但在 iOS 15 中修改器随机工作。一旦我开始在选项卡之间切换,导航栏也开始显示在第三个选项卡上。下面是我的 SwiftUI 文件代码

注意:这只是我的应用程序的更复杂代码设置的简单表示。Xcode:12.5.1 设备:XR(iOS 15 beta)

import SwiftUI

struct TestView: View {
    
    @State var selectedTab: TabType = .home
    
    var body: some View {
        NavigationView {
            TabView(selection: $selectedTab) {
                ForEach(TabType.allCases, id: \.self) { tabType in
                    switch tabType {
                    case .profile:
                        ThirdView()
                            .navigationBarHidden(true)
                            .tag(tabType)
                            .tabItem {
                                Label(tabType.title, systemImage: "plus")
                            }
                    default:
                        SecondView()
                            .tag(tabType)
                            .tabItem {
                                Label(tabType.title, systemImage: "star")
                            }
                    }
                }
            }
        }
    }
}

struct SecondView: View {
    
    var body: some View { …
Run Code Online (Sandbox Code Playgroud)

swift swiftui ios15

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

异步自动释放池

我有一种情况,我正在循环中创建许多 Cocoa 对象async/await,并且内存峰值,因为这些对象仅在循环结束时释放(而不是每次迭代)。

解决方案是使用autoreleasepool. 但是,我似乎无法autoreleasepoolasync/await

这是一个例子:

func getImage() async -> NSImage? {
    return NSImage(named: "imagename") // Do some work
}

Task {
    // This leaks
    for _ in 0 ..< 1000000 {
        let image = await getImage()
        print(image!.backgroundColor)
    }
}
Run Code Online (Sandbox Code Playgroud)

内存一路飙升至 220MB,这对我来说有点太多了。

通常,您可以将内部循环包装在 a 中autoreleasepool,它可以解决问题,但是当我使用函数尝试它时async,我收到此错误:

Cannot pass function of type '() async -> ()' to parameter expecting synchronous function type
Run Code Online (Sandbox Code Playgroud)

有没有办法解决?或者是否有另一种方法可以实现在循环内释放 Cocoa 对象的相同目标?

macos cocoa async-await swift swift-concurrency

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

MainActor 与 MainActor(不安全)

我们可以创建一个@MainActor Task这样的:

Task { @MainActor in
    print("hi")
}
Run Code Online (Sandbox Code Playgroud)

但也有@MainActor(unsafe)这样的:

Task { @MainActor(unsafe) in
    print("hi")
}
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

swift swift-concurrency

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

SwiftUI 中的条件 onTapGesture

MyView我有一个导航链接,当根据编辑模式(或任何其他条件)点击其标签 ( ) 时,我需要不同的行为:

  1. 如果我们处于编辑模式,我想触发导航链接并显示DetailView所选模型。
  2. 如果我们处于编辑模式,我不想触发导航链接并EditingView在模式表中显示 。

这是我想出的一种实现方法:

NavigationLink(tag: model, selection: $displayedItem) {
    DetailView(model: model)
} label: {
    if editMode == .active {
        MyView()
            .onTapGesture {
                editingModel = model
            }
    } else {
        MyView()
    }
}
.sheet(item: $editingModel) { model in
    EditingView(model: model)
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是 if- 和 else- 分支中的视图具有不同的类型(由于修饰符onTapGesture),并且 SwiftUI 不会将它们识别为相同的视图。因此,动画无法插值并且无法正常工作。此外,每次切换MyView时总是会丢失其状态。editMode

(Chris Eidhof 对为什么会发生这种情况做了很好的解释:https://www.objc.io/blog/2021/08/24/conditional-view-modifiers/

所以我继续将 if 语句移动到onTapGesture修饰符内,如下所示,这样我就不会有两个不同的MyViews:

NavigationLink(tag: model, selection: $displayedItem) { …
Run Code Online (Sandbox Code Playgroud)

editmode ios swift swiftui swiftui-navigationlink

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