我正在开发一个登录应用程序,登录后列出了类别。在每个类别下都有一些水平列出的项目。事情是登录后,主页面出现,一切都列出来了。当您单击一个项目时,它会进入详细屏幕,但是当您尝试返回时,它只会崩溃。我发现了这个流程为什么我的 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 的新手,除了导航之外,一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎没有任何解决方案可以解决我的问题。
Q1:为什么 onAppears 会被调用两次?
Q2:或者,我可以在哪里拨打网络电话?
我在代码中的几个不同位置放置了 onAppears,它们都被调用了两次。最终,我试图在显示下一个视图之前进行网络调用,所以如果您知道不使用 onAppear 的方法,我会全力以赴。
我还尝试在我的列表中放置和删除 ForEach,但它没有改变任何东西。
Xcode 12 Beta 3 -> Target iOs 14 CoreData 已启用但尚未使用
struct ChannelListView: View {
@EnvironmentObject var channelStore: ChannelStore
@State private var searchText = ""
@ObservedObject private var networking = Networking()
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchText)
.padding(.top, 20)
List() {
ForEach(channelStore.allChannels) { channel in
NavigationLink(destination: VideoListView(channel: channel)
.onAppear(perform: {
print("PREVIOUS VIEW ON APPEAR")
})) {
ChannelRowView(channel: channel)
}
}
.listStyle(GroupedListStyle())
}
.navigationTitle("Channels")
}
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个BugSplitView单独工作正常但会导致
先决条件失败:属性未能设置初始值
在预览或模拟器中导航到时出错。
该视图具有由水平按钮栏分隔的上部 (Color) 和下部 (Color),并使用 GeometeryReader 和split状态进行布局。当它是 NavigationButton 的目的地时,它不会在预览中正确显示并在模拟器中运行时报告上面的断言。删除它BugButtonBar,它的工作原理。把我难住了!帮助。
import SwiftUI
struct BugSplitView: View {
@State var split : CGFloat = 0.75
var buttons : [BugButtonBar.Info]{
[BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
}
var body: some View {
GeometryReader{ g in
VStack(spacing: 0){
Color.gray
.frame(width: g.size.width, height: (g.size.height) * self.split)
VStack{
BugButtonBar(infos: self.buttons)
Color(white: 0.3)
}
.frame(height: (g.size.height) * (1 - self.split))
}
}.edgesIgnoringSafeArea(.all)
}
}
struct BugButtonBar : View{
struct Info : Identifiable …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方法可以在遗留项目中开始使用SwiftUI并且仍然能够在SwiftUI场景中来回导航。也就是说,让我们想象一下,我只想为去年我一直在从事的项目支持最新的iOS 13。一切都建立在UIKit之上,导航以通常的方式呈现或推送视图控制器。
现在我想开始使用 SwiftUI,所以我在我的项目的 General 中启用了该选项,目标iOS 13,在Info.plist 中获取我的SceneDelegate和我的新键值对。为了导航到Swift UI场景,我可以推送一个UIHostingViewController,其 rootView 将是我新设计的SwiftUI视图。但是如何使用NavigationLink推送旧的UIKit视图控制器?
class ViewController: UIViewController {
@IBAction func userDidTapGo(_ sender: Any) {
let contentView = ContentView()
navigationController?.pushViewController(UIHostingController(rootView: contentView), animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
title = "UIKit"
}
}
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: /* what should …Run Code Online (Sandbox Code Playgroud) 我有以下视图,我需要将item内容传递到另一个视图(DetailsEvent.swift),我正在使用NavigationLink. (我使用的是 Xcode 11 GM)
struct Events: View {
@ObservedObject var networkManager = NetworkManager()
var body: some View {
NavigationView{
List(self.networkManager.eventos.events){ item in
NavigationLink(destination: DetailsEvent(item: item)) {
VStack(alignment: .leading) {
HStack {
Image(systemName: "calendar")
.foregroundColor(.gray)
Text(item.start_date)
.font(.subheadline)
.foregroundColor(.gray)
}
Text(item.title)
.font(.headline)
}
}
}
.navigationBarTitle("Events")
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我以下错误:
传递给不带参数的调用的参数
不传递任何变量:NavigationLink (destination: DetailsEvent ()一切正常。
详情Event.swift
struct DetailsEvent: View {
var body: some View {
Text("here details content")
}
}
Run Code Online (Sandbox Code Playgroud)
我想为 NavigationLink 添加一个额外的功能。
示例代码是这样的:
struct ContentView: View {
func yes () {
print("yes")
}
var body: some View {
NavigationView {
NavigationLink(destination: level1()) {
Text("Next")
}}}}
Run Code Online (Sandbox Code Playgroud)
我知道这行不通,但是有可能做这样的事情吗?(它会去目的地并同时调用该函数)
NavigationLink(destination: level1(), yes()) {Text("Next")}
Run Code Online (Sandbox Code Playgroud)
我尝试在 NavigationLink 中放置一个按钮,但它也不起作用。当我这样做时,只有按钮中的功能起作用,而 NavigationLink 不起作用。
NavigationLink(destination: level1()) {
Button(action: { self.yes() })
{ Text("Button")}
}
Run Code Online (Sandbox Code Playgroud) 导航视图和工作表存在问题。我有以下流程: - ContentView:具有打开 ContentView2 工作表的按钮 - ContentView2:具有导航链接,其标题可转到 ContentView3 - ContentView3:具有导航链接,无标题,可将用户引导至 ContentView2
但是,当我设置上述流程时,当用户在 ContentView2 和 ContentView3 之间来回切换时,我最终会得到堆叠的标头。当用户在两个视图之间来回切换时,我该如何防止这种情况并且只有 1 个标头?谢谢!
struct ContentView: View {
@State var showSheet = false
var body: some View {
Button("Click"){
self.showSheet.toggle()
}
.sheet(isPresented: $showSheet) {
ContentView2()
}
}
}
struct ContentView2: View {
var body: some View {
NavigationView {
NavigationLink(destination: ContentView3()){
Text("Click Here")
}
.navigationBarTitle("Bar Title", displayMode: .inline)
}
}
}
struct ContentView3: View {
var body: some View {
NavigationLink(destination: ContentView2()){
Text("Click Here")
}
} …Run Code Online (Sandbox Code Playgroud) 所以我正在尝试创建一个自定义分页滚动视图。我已经能够创建该包装器,并且该包装器中的内容由一个自定义视图组成。在那个自定义视图中,我有两个 NavigationLink 按钮,按下后应该会将用户带到两个不同的视图。
那些 NavigationLink 按钮不起作用。
该scrollViewWrapper是NavigationView内。我创建了一个测试按钮,它只是一个简单的 Button 并且似乎有效。因此,我在使用 NavigationLink 和 custom 时没有正确执行某些操作UIViewControllerRepresentable。
这是我使用自定义包装器的地方。
NavigationView {
UIScrollViewWrapper {
HStack(spacing: 0) {
ForEach(self.onboardingDataArray, id: \.id) { item in
OnboardingView(onboardingData: item)
.frame(width: geometry.size.width, height: geometry.size.height)
}
}
}.frame(width: geometry.size.width, height: geometry.size.height)
.background(Color.blue)
}
Run Code Online (Sandbox Code Playgroud)
入职视图:
struct OnboardingView: View {
var onboardingData: OnboardingModel
var body: some View {
GeometryReader { geometry in
VStack(spacing: 10) {
Spacer()
Image("\(self.onboardingData.image)")
.resizable()
.frame(width: 300, height: 300)
.aspectRatio(contentMode: ContentMode.fit)
.clipShape(Circle())
.padding(20)
Text("\(self.onboardingData.titleText)")
.frame(width: geometry.size.width, height: …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) 我使用此代码来隐藏导航栏和后退按钮,但是当加载视图时,我仍然可以看到后退按钮一小会儿,然后它就消失了。有什么办法可以阻止它被显示吗?
var body: some View {
NavigationView {
NavigationLink(destination: DeferView { WeekView(journey: self.launcher.completeJourney!) }, isActive: self.$launcher.readyJourney ) { EmptyView () }
.navigationBarHidden(true)
.navigationBarTitle("")
}
}
Run Code Online (Sandbox Code Playgroud)
先感谢您,
navigationlink ×10
swiftui ×10
ios ×4
navigation ×2
function ×1
ios13 ×1
list ×1
networking ×1
onappear ×1
swift ×1
swiftui-list ×1
xcode ×1