Tại sao trình chọn SwiftUI ở vị trí định dạng lại sau khi điều hướng?


12

Sau khi nhấp vào bộ chọn, nó sẽ điều hướng đến chế độ xem được chọn. Danh sách vật phẩm được hiển thị quá xa so với đầu, nhưng bật lên sau khi hoạt ảnh kết thúc. Tại sao chuyện này đang xảy ra?

Bản trình diễn: https://gfycat.com/idioticdizzyazurevase

Tôi đã tạo một ví dụ tối thiểu để loại trừ các tiêu đề và nút trên thanh điều hướng, phần biểu mẫu và các chi tiết khác:

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
        }
    }
}

struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}

Điều này xảy ra trong chế độ xem trước, giả lập và trên thiết bị (Xcode 11.2, iOS 13.2 trong trình giả lập, 13.3 beta 1 trên thiết bị).


Có một đoạn video khá gần đây trên YouTube chứng minh hình thức cơ bản trong SwiftUI, nó làm việc ở đó, vì vậy tôi đoán nó không phải là một lỗi trong SwiftUI bản thân: youtu.be/Ho88Eid9gi0?t=573
Koraktor

Vấn đề tương tự - rất khó chịu. Nếu bạn sử dụng kiểu nội tuyến cho thanh điều hướng, nó sẽ biến mất.
DogCoffee

3
... cũng là văn bản trong các ô nhảy - khoảng 4 px sang phải
DogCoffee

2
@DogCoffee: Tôi đã gỡ lỗi bước nhảy ngang để thay đổi phần trong. Điều này có thể được khắc phục bằng cách thiết lập rõ ràng với .listRowInsets().
Koraktor

nhiều đánh giá cao, công trình tuyệt vời.
DogCoffee

Câu trả lời:


6

Hành vi lỗi rõ ràng có thể được xử lý xung quanh khi buộc kiểu xem điều hướng phải xếp chồng lên nhau:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Đây là một giải pháp cho vấn đề của tôi, nhưng tôi sẽ không đánh dấu đây là câu trả lời được chấp nhận (chưa).

  1. Nó dường như là một lỗi, ngay cả khi nó có thể được kích hoạt bởi các trường hợp đặc biệt.
  2. Giải pháp của tôi sẽ không hoạt động nếu bạn cần một kiểu xem điều hướng khác.
  3. Ngoài ra, nó sẽ không sửa chữa vị trí ngang được đề cập bởi DogCoffee trong các bình luận.

Điều này cũng hữu ích nếu ứng dụng của bạn chạy trên iPad, nếu không, chế độ xem theo chế độ của bạn sẽ hiển thị dưới dạng chế độ xem chi tiết chính.
DogCoffee

2

Theo tôi, nó có liên quan đến thanh điều hướng. Trong mặc định (không đề cập đến .navigationBarTitletiện ích mở rộng), chế độ hiển thị điều hướng được đặt thành .automatic, điều này nên được sửa đổi thành .inline. Tôi đã xem qua một bài viết tương tự như thế này và sử dụng giải pháp của họ để kết hợp với bài viết của bạn, bằng cách sử dụng .navigationBarTitle("", displayMode: .inline)sẽ giúp ích.

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
        }
    }
}


struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}

Điều này giải quyết vấn đề, nhưng nó cũng thay đổi kiểu tiêu đề không mong muốn trong trường hợp của tôi.
Koraktor

2

Cho đến khi lỗi này được giải quyết một cách khác để khắc phục sự cố này trong khi vẫn giữ DoubleColumnNavlationViewStyle cho iPad sẽ đặt điều kiện theo kiểu đó:

let navView = NavigationView {}
if UIDevice.current.userInterfaceIdiom == .pad {
    return AnyView(navView.navigationViewStyle(DoubleColumnNavigationViewStyle()))
} else {
    return AnyView(navView.navigationViewStyle(StackNavigationViewStyle()))
}

0

Cảm ơn chủ đề này tất cả mọi người! Thực sự đã giúp tôi hiểu nhiều thứ hơn và nắm được một trong những vấn đề của tôi. Để chia sẻ với những người khác, tôi gặp vấn đề này nhưng tôi cũng gặp vấn đề này khi tôi đặt một phần xuất hiện trong câu lệnh if / other được đặt trên một phần có chuyển đổi. Khi bật tắt được kích hoạt, nó sẽ dịch chuyển tiêu đề của phần theo chiều ngang một vài pixel.

Sau đây là cách tôi sửa nó

Section(header: Text("Subject Identified").listRowInsets(EdgeInsets()).padding(.leading)) {
                Picker(selection: $subIndex, label: Text("Test")) {
                    ForEach(0 ..< subIdentified.count) {
                        Text(self.subIdentified[$0]).tag($0)
                    }
                }
            .labelsHidden()
            .pickerStyle(SegmentedPickerStyle())

Tôi vẫn có dịch chuyển ngang trên chế độ xem lựa chọn của mình và không biết cách khắc phục. Tôi đã tạo một chủ đề khác để nhận đầu vào. Cảm ơn một lần nữa! SwiftUI Shift Picker Văn bản ngang

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.