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 的行为?
正如您从屏幕截图中看到的,“语言”选项卡出现了两次。
我有以下 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) 您好,我在 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) 当我在日志中收到这些消息时,有什么需要担心的吗?
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) 如果我通过选择另一个项目来更改值,我会尝试将一个项目传递到工作表。即使我从未使用第一项调用工作表,工作表仍会继续显示第一项。
这是一个错误还是我做错了什么?
锻炼列表.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) 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)
我究竟做错了什么?这是一个错误吗?
我试图隐藏第三个选项卡上的导航栏,但对于其余选项卡,它应该显示。它在 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) 我有一种情况,我正在循环中创建许多 Cocoa 对象async/await,并且内存峰值,因为这些对象仅在循环结束时释放(而不是每次迭代)。
解决方案是使用autoreleasepool. 但是,我似乎无法autoreleasepool与async/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 对象的相同目标?
我们可以创建一个@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)
这两种方法有什么区别?
MyView我有一个导航链接,当根据编辑模式(或任何其他条件)点击其标签 ( ) 时,我需要不同的行为:
DetailView所选模型。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) swift ×10
swiftui ×7
ios ×4
macos ×2
async-await ×1
cocoa ×1
editmode ×1
firebase ×1
ios15 ×1
mac-catalyst ×1
swiftui-form ×1
tabbar ×1
tabview ×1