[英]SwiftUI Nav Bar cut off
我最近更新了 Xcode 並且由於某種原因現在在模擬器(和設備上)我的 SwiftUI 視圖上的導航欄被切斷,如下圖所示:
我沒有更改任何代碼,所以我想知道到底發生了什么。 此視圖的代碼供參考如下:
struct EventsView: View {
@ObservedObject var viewModel: EventsViewModel
init() {
viewModel = EventsViewModel()
coloredNavAppearance.configureWithOpaqueBackground()
coloredNavAppearance.backgroundColor = ColorCodes.darkGrey.uicolor()
coloredNavAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
coloredNavAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
UINavigationBar.appearance().standardAppearance = coloredNavAppearance
UINavigationBar.appearance().scrollEdgeAppearance = coloredNavAppearance
UINavigationBar.appearance().tintColor = .white
UITableView.appearance().separatorStyle = .none
}
var body: some View {
NavigationView {
if viewModel.eventViewModels.isEmpty {
ZStack {
ColorCodes.darkGrey.color()
.edgesIgnoringSafeArea(.all)
VStack {
Text("No events are active yet. Click the plus button to purchase an event.").foregroundColor(.white).font(.custom("Segoe UI", size: 17))
}.navigationBarTitle(Text("Active Events"), displayMode: .large)
.navigationBarItems(trailing:
Button(action: {
//show add event modal
self.viewModel.showAddEventModal.toggle()
}) {
Image("plus")
}
)
}
}else {
List{
ForEach(viewModel.eventViewModels, id: \.id) { eventViewModel in
EventRow(viewModel: eventViewModel)
}.listRowBackground(ColorCodes.darkGrey.color())
}
.navigationBarTitle(Text("Active Events"), displayMode: .large)
.navigationBarItems(trailing:
Button(action: {
//show add event modal
self.viewModel.showAddEventModal.toggle()
}) {
Image(systemName: "plus")
}
)
.alert(isPresented: $viewModel.showAlert) {
Alert(title: Text("Error"), message: Text(viewModel.errorMessage), dismissButton: .default(Text("Ok")))
}
.sheet(isPresented: $viewModel.showAddEventModal) {
AddEventView(viewModel: AddEventViewModel())
}
}
}
}
}
這是一個事件的樣子:
struct Event: Codable, Identifiable {
public let id: String
public let name: String
public let phoneNumber: PhoneNumber
public let isActive: Bool
public let startDate: Date
enum CodingKeys: String, CodingKey {
case id = "id"
case name = "name"
case phoneNumber = "event_phone_number"
case startDate = "start"
}
}
這是事件視圖 model:
import Combine
enum EventViewModelState {
case loading
case finishedLoading
case error(Error)
}
class EventsViewModel: ObservableObject {
@Published private(set) var eventViewModels: [EventCellViewModel] = []
@Published private(set) var state: EventViewModelState = .loading
@Published var errorMessage: String = ""
@Published var showAlert: Bool = false
@Published var showAddEventModal: Bool = false
private var getEventsCancellable: AnyCancellable?
private let eventService: EventServiceProtocol
init(eventService: EventServiceProtocol = EventService()) {
self.eventService = eventService
getEvents()
}
func getEvents() {
state = .loading
getEventsCancellable = eventService
.getEvents()
.sink(receiveCompletion: { [weak self] (completion) in
switch completion {
case .failure(let serviceError):
if let errorCasted = serviceError as? ServiceError {
self?.unWrapError(error: errorCasted)
self?.state = .error(serviceError)
self?.showAlert = true
}
case .finished: self?.state = .finishedLoading
}
}) { [weak self] events in
self?.eventViewModels = events.map {
EventCellViewModel(event: $0)
}
}
}
func unWrapError(error: ServiceError) {
switch error {
case .url:
self.errorMessage = "There was something wrong with the url request, please contact support."
case .urlRequest:
self.errorMessage = "There was something wrong with the url request, please contact support."
case .decode:
self.errorMessage = "There was something wrong with the response. Please make sure you are on the latest version of the app or contact support."
case .internalError(let errorString):
self.errorMessage = errorString
}
}
}
這是事件單元格視圖 model:
import Foundation
import Combine
class EventCellViewModel: ObservableObject {
@Published var name: String = ""
@Published var eventPhoneNumber: String = ""
@Published var startDate: String = ""
@Published var id: String = ""
private let event: Event
init(event: Event) {
self.event = event
setUpBindings()
}
func setUpBindings() {
id = String(event.id)
name = event.name
eventPhoneNumber = event.phoneNumber.phoneNumber
startDate = event.startDate.toShortDate()
}
}
我確實在 class 的 init 中設置了一些自定義導航欄外觀設置,但這之前工作得很好。 這是否發生在其他人身上,是否有人找到或找到解決方法? 此外,由於這里有一個項目,如下所示,它進入了我視圖的 else 塊,而不是你看到 ZStack 的 if,所以這不是我和其他人之前認為的問題。 我也嘗試過完全刪除該部分,但這仍然會發生。
這是否解決了您的問題:
.navigationBarItems(trailing:
Button(action: {
//show add event modal
self.viewModel.showAddEventModal.toggle()
}) {
Image(systemName: "plus")
}
)
弄清楚了。 不知何故這條線
.edgesIgnoringSafeArea(.top)
被添加到我的標簽視圖中並導致所有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.