SwiftUI开发问题求助:NavigationButton失效及视图居中异常
看起来你在SwiftUI开发中遇到了两个常见的小问题,我来帮你逐个解决:
问题1:navigationBarItems中的NavigationButton无法正常工作
首先要注意,NavigationButton在SwiftUI的早期版本之后就已经被废弃了,现在我们应该使用NavigationLink来实现页面跳转。另外,从iOS 16开始,navigationBarItems也被标记为过时,推荐使用toolbar配合ToolbarItem来添加导航栏按钮。
修改方案:
如果你的项目支持iOS 16+,可以这样修改导航栏部分的代码:
.toolbar { ToolbarItem(placement: .navigationBarTrailing) { NavigationLink(destination: AddContactView()) { Text("Edit") .font(AppFonts.Regular.withSize(17.0)) .foregroundColor(AppColors.themeGreen) } } }
如果需要兼容更低版本的iOS,仍然可以使用navigationBarItems,但要把NavigationButton替换成NavigationLink:
.navigationBarItems(trailing: NavigationLink(destination: AddContactView()) { Text("Edit") .font(AppFonts.Regular.withSize(17.0)) .foregroundColor(AppColors.themeGreen) })
另外要确保你的ContactDetailView是被包裹在NavigationView(iOS 15及以下)或者NavigationStack(iOS 16+)中的,否则导航栏和跳转都无法正常工作。
问题2:视图未从屏幕顶部开始,始终居中显示
这是因为VStack默认的布局是将内容垂直居中,并且不会自动占满整个屏幕的高度。我们需要调整VStack的frame和对齐方式,让它从顶部开始布局。
修改方案:
给你的VStack添加frame(maxWidth: .infinity, maxHeight: .infinity)来让它占满整个屏幕,同时设置alignment: .top让内容从顶部开始排列:
VStack(alignment: .top, spacing: 0) { // 可以根据需求调整alignment和spacing ContactDetailHeaderView() .edgesIgnoringSafeArea(.top) .frame(height: UIDevice.screenWidth*0.8) .listRowInsets(EdgeInsets()) .background(LinearGradient(gradient: Gradient(colors: [AppColors.white, AppColors.themeGreen.opacity(0.6)]), startPoint: .top, endPoint: .bottom), cornerRadius: 0) ContactDetailRow(title: "Mobile", description: "+91 1248932410") ContactDetailRow(title: "Email", description: "pramod@yopmail.com") } .frame(maxWidth: .infinity, maxHeight: .infinity)
另外,如果你不需要VStack的默认间距,可以设置spacing: 0,这样各个子视图之间就不会有默认的空隙了。
完整修改后的代码
struct ContactDetailView : View { var body: some View { VStack(alignment: .top, spacing: 0) { ContactDetailHeaderView() .edgesIgnoringSafeArea(.top) .frame(height: UIDevice.screenWidth*0.8) .listRowInsets(EdgeInsets()) .background(LinearGradient(gradient: Gradient(colors: [AppColors.white, AppColors.themeGreen.opacity(0.6)]), startPoint: .top, endPoint: .bottom), cornerRadius: 0) ContactDetailRow(title: "Mobile", description: "+91 1248932410") ContactDetailRow(title: "Email", description: "pramod@yopmail.com") } .frame(maxWidth: .infinity, maxHeight: .infinity) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { NavigationLink(destination: AddContactView()) { Text("Edit") .font(AppFonts.Regular.withSize(17.0)) .foregroundColor(AppColors.themeGreen) } } } } }
内容的提问来源于stack exchange,提问作者Pramod Kumar
相关产品推荐
相关产品推荐

