我有这个 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)。
我尝试为更大的、可用于生产的 SwiftUI 应用程序构建架构。我一直在遇到同样的问题,这指向 SwiftUI 中的一个主要设计缺陷。
仍然没有人能给我一个完整的工作,生产就绪的答案。
如何做SwiftUI
包含导航的可重用视图?
由于它SwiftUI
NavigationLink
与视图有很强的联系,这根本不可能以这样的方式在更大的应用程序中扩展。NavigationLink
在那些小样本应用程序中,是的 - 但不是当您想在一个应用程序中重用许多视图时。也可能在模块边界上重用。(例如:在 iOS、WatchOS 等中重用 View...)
设计问题:导航链接被硬编码到视图中。
NavigationLink(destination: MyCustomView(item: item))
Run Code Online (Sandbox Code Playgroud)
但是如果包含这个的视图NavigationLink
应该是可重用的,我就不能对目的地进行硬编码。必须有一种机制来提供目的地。我在这里问了这个问题并得到了很好的答案,但仍然不是完整的答案:
这个想法是将目标链接注入可重用视图。一般来说,这个想法可行,但不幸的是,这并不能扩展到真正的生产应用程序。一旦我有多个可重用的屏幕,我就会遇到一个逻辑问题,即一个可重用的视图 ( ViewA
) 需要一个预配置的视图目标 ( ViewB
)。但是如果ViewB
还需要一个预配置的 view-destinationViewC
呢?我需要建立ViewB
在这样的方式已经ViewC
被注入已经ViewB
在我注入ViewB
到ViewA
。等等......但由于当时必须传递的数据不可用,整个构造失败。
我的另一个想法是使用Environment
as 依赖注入机制为NavigationLink
. 但我认为这或多或少应该被视为一种黑客行为,而不是大型应用程序的可扩展解决方案。我们最终会基本上将环境用于所有事情。但是因为 Environment 也只能在 View 内部使用(而不是在单独的 Coordinators 或 ViewModels 中),所以在我看来这将再次创建奇怪的构造。
就像业务逻辑(例如视图模型代码)和视图必须分开,导航和视图也必须分开(例如协调器模式)UIKit
因为我们访问视图UIViewController
和UINavigationController …
我正在开发一个登录应用程序,登录后列出了类别。在每个类别下都有一些水平列出的项目。事情是登录后,主页面出现,一切都列出来了。当您单击一个项目时,它会进入详细屏幕,但是当您尝试返回时,它只会崩溃。我发现了这个流程为什么我的 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 的新手,除了导航之外,一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎没有任何解决方案可以解决我的问题。
如果我有使用SwiftUI制作的应用程序,那么它可以在iOS 13以下的iOS上运行吗?
现在,AppDelegate
和SceneDelegate
从SwiftUI删除,你在哪里我把我以前在代码SceneDelegate
和AppDelegate
,火力地堡配置为前?
所以我目前在我的代码中有这个代码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) 我正在寻找创建一个可以由视图模型(不仅仅是视图)访问的 EnvironmentObject。
Environment 对象跟踪应用程序会话数据,例如登录、访问令牌等,这些数据将被传递到视图模型(或需要时的服务类)以允许调用 API 以从该 EnvironmentObjects 传递数据。
我试图将会话对象从视图传递给视图模型类的初始化程序,但出现错误。
如何使用 SwiftUI 访问/传递 EnvironmentObject 到视图模型中?
苹果的新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)>
。这被黑入 …
我想在 SwiftUI 中实现一个动画,“显示”视图的内容以启用展开/折叠功能。我想要折叠和展开的视图内容很复杂:它不仅仅是一个简单的框,而是动态高度和内容的视图层次结构,包括图像和文本。
我尝试过不同的选择,但没有达到预期的效果。通常发生的情况是,当我“展开”时,整个视图立即以 0% 不透明度显示,然后逐渐淡入,展开视图下的按钮同时向下移动。这就是当我使用if
实际添加和删除视图的条件语句时发生的情况。所以这是有道理的。
然后我尝试使用frame
修饰符:.frame(maxHeight: isExpanded ? .infinity : 0)
。但这导致视图的内容被“压缩”而不是显示。
我制作了我想要的纸质原型:
关于如何实现这一目标有什么想法吗?
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)
我希望整个视图具有带圆角的蓝色边框(而不是与圆形蓝色边框重叠的红色正方形。如何实现?我似乎已经尝试了排序修改器的所有变体。
该.animation()
修饰符在 iOS 15 中已被弃用,但我不确定我是否理解 Xcode 建议的等效项 , 的animation(_:value:)
工作原理。
.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我如何更改我的代码以消除警告?
\nswiftui ×10
swift ×7
ios ×4
xcode ×3
animation ×1
firebase ×1
ios12 ×1
ios14 ×1
ios15 ×1
modal-dialog ×1
mvvm ×1
navigation ×1
viewmodifier ×1
xcode12 ×1