标签: swiftui

多个工作表(isPresented :) 在 SwiftUI 中不起作用

我有这个 ContentView 有两个不同的模式视图,所以我sheet(isPresented:)同时使用这两个视图,但似乎只有最后一个被呈现。我怎么能解决这个问题?或者无法在 SwiftUI 的视图上使用多个工作表?

struct ContentView: View {
    
    @State private var firstIsPresented = false
    @State private var secondIsPresented = false
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.firstIsPresented.toggle()
                }
                Button ("Second modal view") {
                    self.secondIsPresented.toggle()
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $firstIsPresented) {
                    Text("First modal view")
            }
            .sheet(isPresented: $secondIsPresented) {
                    Text("Only the second modal view works!")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码编译时没有警告(Xcode 11.2.1)。

modal-dialog swift swiftui

129
推荐指数
7
解决办法
3万
查看次数

SwiftUI - 如何避免导航硬编码到视图中?

我尝试为更大的、可用于生产的 SwiftUI 应用程序构建架构。我一直在遇到同样的问题,这指向 SwiftUI 中的一个主要设计缺陷。

仍然没有人能给我一个完整的工作,生产就绪的答案。

如何做SwiftUI包含导航的可重用视图?

由于它SwiftUI NavigationLink与视图有很强的联系,这根本不可能以这样的方式在更大的应用程序中扩展。NavigationLink在那些小样本应用程序中,是的 - 但不是当您想在一个应用程序中重用许多视图时。也可能在模块边界上重用。(例如:在 iOS、WatchOS 等中重用 View...)

设计问题:导航链接被硬编码到视图中。

NavigationLink(destination: MyCustomView(item: item))
Run Code Online (Sandbox Code Playgroud)

但是如果包含这个的视图NavigationLink应该是可重用的,我就不能对目的地进行硬编码。必须有一种机制来提供目的地。我在这里问了这个问题并得到了很好的答案,但仍然不是完整的答案:

SwiftUI MVVM 协调器/路由器/导航链接

这个想法是将目标链接注入可重用视图。一般来说,这个想法可行,但不幸的是,这并不能扩展到真正的生产应用程序。一旦我有多个可重用的屏幕,我就会遇到一个逻辑问题,即一个可重用的视图 ( ViewA) 需要一个预配置的视图目标 ( ViewB)。但是如果ViewB还需要一个预配置的 view-destinationViewC呢?我需要建立ViewB在这样的方式已经ViewC被注入已经ViewB在我注入ViewBViewA。等等......但由于当时必须传递的数据不可用,整个构造失败。

我的另一个想法是使用Environmentas 依赖注入机制为NavigationLink. 但我认为这或多或少应该被视为一种黑客行为,而不是大型应用程序的可扩展解决方案。我们最终会基本上将环境用于所有事情。但是因为 Environment 也只能在 View 内部使用(而不是在单独的 Coordinators 或 ViewModels 中),所以在我看来这将再次创建奇怪的构造。

就像业务逻辑(例如视图模型代码)和视图必须分开,导航和视图也必须分开(例如协调器模式)UIKit因为我们访问视图UIViewControllerUINavigationController …

xcode ios swift swiftui swiftui-navigationlink

109
推荐指数
6
解决办法
8034
查看次数

NavigationLink 只工作一次

我正在开发一个登录应用程序,登录后列出了类别。在每个类别下都有一些水平列出的项目。事情是登录后,主页面出现,一切都列出来了。当您单击一个项目时,它会进入详细屏幕,但是当您尝试返回时,它只会崩溃。我发现了这个流程为什么我的 SwiftUI 应用程序在“NavigationView”中的“navigationBarItems”内放置“NavigationLink”后向后导航时会崩溃?但我无法解决我的问题。由于我的项目变得复杂,我只想在swiftui中练习导航并创建了一个新项目。顺便说一下,我下载了最新的 xcode 版本 11.3。我写了一个简单的代码如下:

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")
Run Code Online (Sandbox Code Playgroud)

而 Test() 视图如下:

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这非常简单。我也在互联网上尝试过类似的例子,但它并没有像它想象的那样工作。当我运行该项目时,我单击导航链接并导航到 Test() 视图。然后我点击后退按钮,它导航到主页。但是,当我第二次单击导航链接时,没有任何反应。导航链接只工作一次,之后什么也没有发生。它不导航,也不抛出任何错误。我是 swiftui 的新手,除了导航之外,一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎没有任何解决方案可以解决我的问题。

navigation xcode ios swiftui navigationlink

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

SwiftUI向后兼容iOS 12.x和更早版本吗?

如果我有使用SwiftUI制作的应用程序,那么它可以在iOS 13以下的iOS上运行吗?

swift ios12 swiftui

89
推荐指数
9
解决办法
2万
查看次数

SwiftUI 应用生命周期 iOS14 AppDelegate 代码放在哪里?

现在,AppDelegateSceneDelegate从SwiftUI删除,你在哪里我把我以前在代码SceneDelegateAppDelegate,火力地堡配置为前?

所以我目前在我的代码中有这个代码AppDelegate

我现在应该把这段代码放在哪里?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    
    FirebaseConfiguration.shared.setLoggerLevel(.min)
    FirebaseApp.configure()
    return true
}
Run Code Online (Sandbox Code Playgroud)

ios firebase swiftui ios14 xcode12

74
推荐指数
4
解决办法
2万
查看次数

SwiftUI - 如何将 EnvironmentObject 传递到视图模型中?

我正在寻找创建一个可以由视图模型(不仅仅是视图)访问的 EnvironmentObject。

Environment 对象跟踪应用程序会话数据,例如登录、访问令牌等,这些数据将被传递到视图模型(或需要时的服务类)以允许调用 API 以从该 EnvironmentObjects 传递数据。

我试图将会话对象从视图传递给视图模型类的初始化程序,但出现错误。

如何使用 SwiftUI 访问/传递 EnvironmentObject 到视图模型中?

mvvm ios swift swiftui

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

什么使SwiftUI的DSL成为可能?

苹果的新SwiftUI框架似乎使用了一种新型语法,可以有效地构建元组,但又具有另一种语法:

var body: some View {
    VStack(alignment: .leading) {
        Text("Hello, World") // No comma, no separator ?!
        Text("Hello World!")
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试解决这种语法的实际含义时,我发现VStack此处使用的初始化程序将类型的闭包() -> Content 作为第二个参数,其中Content的通用参数View是通过闭包推断的。为了找出要Content推断的类型,我对代码进行了一些更改,并保持了其功能:

var body: some View {
    let test = VStack(alignment: .leading) {
        Text("Hello, World")
        Text("Hello World!")
    }

    return test
}
Run Code Online (Sandbox Code Playgroud)

这样,就test表明自己是类型的VStack<TupleView<(Text, Text)>>,即Content是类型的TupleView<Text, Text>。向上看TupleView,我发现它是一个源自SwiftUI自身的包装器类型,只能通过传递应该包装的元组来初始化。

现在,我想知道Text这个示例中的两个实例如何转换为TupleView<(Text, Text)>。这被黑入 …

swift swiftui

66
推荐指数
2
解决办法
4895
查看次数

如何在 SwiftUI 中制作“显示”式折叠/展开动画?

我想在 SwiftUI 中实现一个动画,“显示”视图的内容以启用展开/折叠功能。我想要折叠和展开的视图内容很复杂:它不仅仅是一个简单的框,而是动态高度和内容的视图层次结构,包括图像和文本。

我尝试过不同的选择,但没有达到预期的效果。通常发生的情况是,当我“展开”时,整个视图立即以 0% 不透明度显示,然后逐渐淡入,展开视图下的按钮同时向下移动。这就是当我使用if实际添加和删除视图的条件语句时发生的情况。所以这是有道理的。

然后我尝试使用frame修饰符:.frame(maxHeight: isExpanded ? .infinity : 0)。但这导致视图的内容被“压缩”而不是显示。

我制作了我想要的纸质原型:

纸质原型

关于如何实现这一目标有什么想法吗?

animation swift swiftui

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

带有圆角和边框的 SwiftUI 视图

            ZStack {
                VStack {
                    Text("some text")
                    Button("Ok") {}
                     .foregroundColor(.cyan)
                     .padding()
                }
                .padding()
            }
            .background(.red)
            .border(.blue, width: 5)
            .cornerRadius(20)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我希望整个视图具有带圆角的蓝色边框(而不是与圆形蓝色边框重叠的红色正方形。如何实现?我似乎已经尝试了排序修改器的所有变体。

swift swiftui viewmodifier

64
推荐指数
3
解决办法
5万
查看次数

如何替换 SwiftUI 中已弃用的 .animation() ?

.animation()修饰符在 iOS 15 中已被弃用,但我不确定我是否理解 Xcode 建议的等效项 , 的animation(_:value:)工作原理。

\n
.animation(.easeInOut(duration: 2)) // \xe2\x9a\xa0\xef\xb8\x8f'animation' was deprecated in iOS 15.0: Use withAnimation or animation(_:value:) instead.\n
Run Code Online (Sandbox Code Playgroud)\n

我如何更改我的代码以消除警告?

\n

xcode swiftui ios15

57
推荐指数
3
解决办法
4万
查看次数