我正在尝试按顺序获得一个深层嵌套的编程导航堆栈。当手动完成导航(即:按下链接)时,以下代码按预期工作。当您按下Set Nav按钮时,导航堆栈确实发生了变化 - 但不像预期的那样 - 最终堆栈损坏[start -> b -> bbb],并且视图之间有很多翻转
class NavState: ObservableObject {
@Published var firstLevel: String? = nil
@Published var secondLevel: String? = nil
@Published var thirdLevel: String? = nil
}
struct LandingPageView: View {
@ObservedObject var navigationState: NavState
func resetNav() {
self.navigationState.firstLevel = "b"
self.navigationState.secondLevel = "ba"
self.navigationState.thirdLevel = "bbb"
}
var body: some View {
return NavigationView {
List {
NavigationLink(
destination: Place(
text: "a",
childValues: [ ("aa", [ "aaa"]) ],
navigationState: …Run Code Online (Sandbox Code Playgroud) navigation swiftui ios-navigationview swiftui-navigationlink
我用我@EnvironmentObject的让我的 TeamData 可以被不同的人使用,但它不能很好地工作。当我通过列表中的导航链接转到另一个视图时,这很好。当我点击同一个视图的按钮时,它崩溃了..
我想我放错了什么。有人可以帮助解决这个问题吗?这是否意味着我需要先@EnvironmentObject在 NavigationView添加才能使用它?谢谢
演示:https : //youtu.be/-iRadrHd94c
import SwiftUI
struct GameRecordListView: View {
@EnvironmentObject var teamResult : TeamResult
@State var hint : String = ""
@State var successRegistration : Bool = false
@State var sheetPresented: Bool = false
var body: some View {
VStack{
List(0 ..< 12){ item in
NavigationLink(destination: GameDetailRecordView()){ <-this works well
Text("444")
}
}
VStack{
Spacer()
HStack{
Spacer()
NavigationLink(destination: GameDetailRecordView()) <-this doesn't works well and crashed
{
Image(systemName: "pencil.circle")
.resizable()
.frame(width: …Run Code Online (Sandbox Code Playgroud) 到目前为止,我有一个完全使用 UIKit 构建的应用程序。但是,我希望能够开始实现一些 SwiftUI 视图来替换一些 UIViewController。
我已经能够通过点击按钮从 UIViewController 导航到 SwiftUI 视图:
@IBAction func buttonTapped(_ sender: Any) {
let newView = UIHostingController(rootView: SwiftUIView(viewObj: self.view, sb: self.storyboard, dismiss: self.dismiss) )
view.window?.rootViewController = newView
view.window?.makeKeyAndVisible()
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何从单个 SwiftUI 视图过渡到 UIViewController?(因为应用程序的其余部分都在 UIKit 中)?我在 SwiftUI 视图中有一个按钮,可以在点击时导航回 UIViewController。我试过了:
view和storyboard对象传递给 SwiftUI 视图,然后调用执行类似于上面代码的操作来更改当前视图控制器。但是,在模拟器上尝试时没有任何反应。.present以显示SwiftUI观模态。这有效,我可以允许 SwiftUI 视图.dismiss自己使用。但是,这只适用于模态,我希望使其正常工作(即更改屏幕)这是我的简单 SwiftUI 视图:
struct SwiftUIView: View {
var viewObj:UIView? // Perhaps use this for transition back?
var sb:UIStoryboard?
var dismiss: (() -> Void)?
var …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SwiftUI 中实现编程视图弹出的逻辑
我在项目上设置了一个标签并为所选项目创建了一个相应的变量,但是当我单击 DetaiView 屏幕上的按钮时,没有任何反应。
如果我使用 VStack 而不是 List 或使用presentationMode环境变量来释放屏幕,问题就会消失,但我想使用List。
代码:
struct ContentView: View {
@State var data: [Int] = [1, 2, 3, 4, 5]
@State var selectedItem: Int? = nil
var body: some View {
NavigationView {
// NavigationLink( // This make dismiss work
// destination: DetailView(selectedItem: $selectedItem),
// tag: 123,
// selection: $selectedItem,
// label: { Text("\(123)") }
// )
List { // VStack here make dismiss work
ForEach(data, id: \.self) { element in
NavigationLink(
destination: DetailView(selectedItem: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SwiftUI 中的列表或 ForEach 循环中执行 NavigationLink。不幸的是,我得到了一个非常奇怪的行为(例如,当点击 Leo 时它会打开 Karl,Opening Max 也指向 Karl)。
我已经发现它与 NavigationLink 中的“isActive”属性有关。不幸的是,我需要它在此处实现此行为:https : //i.stack.imgur.com/g0BFz.gif此处也询问SwiftUI - Nested NavigationView: Go back to root。
我还尝试使用选择和标签属性,但我无法实现“返回根目录”机制。
这是示例:
import SwiftUI
struct Model: Equatable, Hashable {
var userId: String
var firstName: String
var lastName: String
}
struct ContentView: View {
@State var navigationViewIsActive: Bool = false
var myModelArray: [Model] = [
Model(userId: "27e880a9-54c5-4da1-afff-05b4584b1d2f", firstName: "Leo", lastName: "Test"),
Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Max", lastName: "Test"),
Model(userId: "1050412a-cb12-4160-b7e4-2702ab8430c3", firstName: "Karl", lastName: "Test")] …Run Code Online (Sandbox Code Playgroud) 控制台错误: SwiftUI 在推送导航链接时遇到问题。请提交错误。
NavigationLink 中不使用 isActive 参数是没有问题的。但是,我必须使用 isActive 参数。因为我相应地关闭了下拉列表。
菜单型号:
struct Menu: Identifiable {
var id: Int
var pageName: String
var icon: String
var page: Any
var startDelay: Double
var endDelay: Double
// var offsetY: CGFloat
}
let menu = [
Menu(id: 1, pageName: "Profil", icon: "person.crop.circle", page: ProfileView(), startDelay: 0.2, endDelay: 0.6),
Menu(id: 2, pageName: "Sepet", icon: "cart", page: CartView(), startDelay: 0.4, endDelay: 0.4),
Menu(id: 3, pageName: "?stek", icon: "plus.circle", page: ClaimView(), startDelay: 0.6, endDelay: 0.2)
]
Run Code Online (Sandbox Code Playgroud)
菜单视图
struct …Run Code Online (Sandbox Code Playgroud) 我有一个简单的用例,其中一个屏幕使用NavigationLink. iOS 14.5 beta (1, 2, 3) 有一个奇怪的行为,推送的屏幕在被推送后就弹出。
我设法创建了一个示例应用程序,并在其中重现它。我相信原因是存在@Environment(\.presentationMode)似乎重新创建视图并导致弹出视图的原因。
完全相同的 cod 在 Xcode 12 / iOS 14.4 中运行良好
这是一个示例代码。
import SwiftUI
public struct FirstScreen: View {
public init() {}
public var body: some View {
NavigationView {
List {
row
row
row
}
}
}
private var row: some View {
NavigationLink(destination: SecondScreen()) {
Text("Row")
}
}
}
struct SecondScreen: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
public var body: some View {
VStack(spacing: 10) {
NavigationLink(destination: …Run Code Online (Sandbox Code Playgroud) 我在带有拆分视图(横向)的 iPad 上的 NavigationLink 遇到了一些问题。下面是一个例子:
这是重现问题的代码:
import SwiftUI
final class MyEnvironmentObject: ObservableObject {
@Published var isOn: Bool = false
}
struct ContentView: View {
@EnvironmentObject var object: MyEnvironmentObject
var body: some View {
NavigationView {
NavigationLink("Go to FirstDestinationView", destination: FirstDestinationView(isOn: $object.isOn))
}
}
}
struct FirstDestinationView: View {
@Binding var isOn: Bool
var body: some View {
NavigationLink("Go to SecondDestinationView", destination: SecondDestinationView(isOn: $isOn))
}
}
struct SecondDestinationView: View {
@Binding var isOn: Bool
var body: some View {
Toggle(isOn: $isOn) …Run Code Online (Sandbox Code Playgroud) 我有一个超级简单的 SwiftUI 主从应用程序:
import SwiftUI
struct ContentView: View {
@State private var imageNames = [String]()
var body: some View {
NavigationView {
MasterView(imageNames: $imageNames)
.navigationBarTitle(Text("Master"))
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation {
// simplified for example
self.imageNames.insert("image", at: 0)
}
}
) {
Image(systemName: "plus")
}
)
}
}
}
struct MasterView: View {
@Binding var imageNames: [String]
var body: some View {
List {
ForEach(imageNames, id: \.self) { imageName in
NavigationLink(
destination: DetailView(selectedImageName: imageName)
) {
Text(imageName) …Run Code Online (Sandbox Code Playgroud) FirstView Appeared打印两次。首次加载视图时一次,选择 NavigationLink 时再次加载。
import SwiftUI
struct FirstView: View {
var body: some View {
NavigationView{
ZStack{
Text("FirstView").onAppear(perform: {print("FirstView Appeared")})
NavigationLink(destination: SecondView()) {
Text("Goto SecondView")
}.offset(y: 50)
}
}
}
}
struct SecondView: View {
var body: some View {
Text("SecondView").onAppear(perform: {print("SecondView Appeared")})
}
}
Run Code Online (Sandbox Code Playgroud)
在模拟器和个人设备上运行上面的代码在Xcode 12.0 beta中,在选择NavigationLink时,在下面的Xcode 12.0 Beta中会产生下面的输出:
FirstView Appeared
FirstView Appeared
SecondView Appeared
Run Code Online (Sandbox Code Playgroud)
这是 onAppear() 预期行为的重复吗?
如果是这样,有什么最佳实践可以在firstview创建时加载一些数据,然后返回到firstview(因为 onAppear() 会在导航离开时尝试加载一些数据firstView)
swiftui ×10
navigation ×2
foreach ×1
ios ×1
list ×1
swift ×1
swiftui-list ×1
uikit ×1
xcode12 ×1