Trình bày một quan điểm mới trong SwiftUI


11

Tôi muốn nhấp vào nút và sau đó hiển thị chế độ xem mới như present modallytrong UIKit nhập mô tả hình ảnh ở đây

Tôi đã thấy " Cách trình bày một chế độ xem mới bằng cách sử dụng các trang tính ", nhưng tôi không muốn đính kèm nó vào chế độ xem chính dưới dạng một biểu mẫu.

Và tôi không muốn sử dụng NavigationLink, vì tôi không muốn một chế độ xem mới và chế độ xem cũ có mối quan hệ điều hướng.

Cảm ơn bạn đã giúp đỡ...


Tại sao bạn không muốn đính kèm nó vào chế độ xem chính dưới dạng bảng phương thức? Đó là một phương pháp tiêu chuẩn ngay cả trong UIKit. Bạn có bất kỳ lý do đặc biệt?
Mojtaba Hosseini

Tôi cố gắng giải thích suy nghĩ của mình ... Nếu có gì sai, xin hãy sửa cho tôi.
CH Cánh

Ứng dụng có 3 chế độ xem, 1: Đăng nhập Trang 2: TableView Trang 3: Trang TableDetail, trang TableView và trang TableDetail là quan hệ điều hướng. Sau khi đăng nhập sẽ hiển thị cho trang TableView, trang TableView không có bất kỳ mối quan hệ nào với trang đăng nhập sau khi đăng nhập
CH Wing

Vì vậy, bạn cần nó phải được fullscreen?
Mojtaba Hosseini

ys tôi muốnfullscreen
CH Wing

Câu trả lời:


12

Để hiển thị một phương thức (kiểu iOS 13)

Bạn chỉ cần một đơn giản sheetvới khả năng tự loại bỏ:

struct ModalView: View {
    @Binding var presentedAsModal: Bool
    var body: some View {
        Button("dismiss") { self.presentedAsModal = false }
    }
}

Và trình bày nó như sau:

struct ContentView: View {
    @State var presentingModal = false

    var body: some View {
        Button("Present") { self.presentingModal = true }
        .sheet(isPresented: $presentingModal) { ModalView(presentedAsModal: self.$presentingModal) }
    }
}

Lưu ý rằng tôi đã chuyển qua presentingModalphương thức để bạn có thể loại bỏ nó khỏi phương thức, nhưng bạn có thể thoát khỏi nó.


Để làm cho nó thực sự hiện diện fullscreen(Không chỉ trực quan)

Bạn cần truy cập vào ViewController . Vì vậy, bạn cần một số thùng chứa trợ giúp và công cụ môi trường:

struct ViewControllerHolder {
    weak var value: UIViewController?
}

struct ViewControllerKey: EnvironmentKey {
    static var defaultValue: ViewControllerHolder {
        return ViewControllerHolder(value: UIApplication.shared.windows.first?.rootViewController)

    }
}

extension EnvironmentValues {
    var viewController: UIViewController? {
        get { return self[ViewControllerKey.self].value }
        set { self[ViewControllerKey.self].value = newValue }
    }
}

Sau đó, bạn nên sử dụng thực hiện phần mở rộng này:

extension UIViewController {
    func present<Content: View>(style: UIModalPresentationStyle = .automatic, @ViewBuilder builder: () -> Content) {
        let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
        toPresent.modalPresentationStyle = style
        toPresent.rootView = AnyView(
            builder()
                .environment(\.viewController, toPresent)
        )
        self.present(toPresent, animated: true, completion: nil)
    }
}

Cuối cùng

bạn có thể làm cho nó fullscreennhư:

struct ContentView: View {
    @Environment(\.viewController) private var viewControllerHolder: UIViewController?

    var body: some View {
        Button("Login") {
            self.viewControllerHolder?.present(style: .fullScreen) {
                Text("Main") // Or any other view you like
            }
        }
    }
}

tuyệt quá! cảm ơn giải pháp chi tiết của bạn
CH Wing

Tôi gặp lỗi này tại trình bao bọc thuộc tính môi trường: Không thể chuyển đổi giá trị của loại 'Môi trường <UIViewContoder?>'
Sang

Nó nên được xử lý theo mặc định, nhưng hãy thử thêm ?vào cuối dòng ở đó. @jsbeginnerNodeJS
Mojtaba Hosseini

Tôi nhận được lỗi này trong giao diện điều khiển: `` `Cảnh báo: Cố gắng để có mặt <_TtGC7SwiftUI19UIHostingControllerVS_7AnyView_: 0x7fafd2641d30> trên <_TtGC7SwiftUI19UIHostingControllerVS_7AnyView_: 0x7fafd2611bd0> mà xem không có trong hệ thống phân cấp sổ` ``!
jsbeginnerNodeJS

Làm thế nào để bạn loại bỏ nó?
gabrielapittari

0

Đây là một cách đơn giản - quan điểm về phía trước. Nó rất thẳng về phía trước.

        struct ChildView: View{
           private  let colors: [Color] = [.red, .yellow,.green,.white]
           @Binding var index : Int
           var body: some View {
           let next = (self.index+1)  % MyContainer.totalChildren
             return   ZStack{
                    colors[self.index  % colors.count]
                     Button("myNextView \(next)   ", action: {
                    withAnimation{
                        self.index = next
                    }
                    }
                )}.transition(.asymmetric(insertion: .move(edge: .trailing)  , removal:  .move(edge: .leading)  ))
            }
        }

        struct MyContainer: View {
            static var totalChildren = 10
            @State private var value: Int = 0
            var body: some View {
                    HStack{
                        ForEach(0..<(Self.totalChildren) ) { index in
                            Group{
                            if    index == self.value {
                                ChildView(index:  self.$value)
                                }}
                            }
                }
                }
        }

-1

Tuyên bố từ chối trách nhiệm: Dưới đây không thực sự giống như một "phương thức bản địa", không hành xử cũng không nhìn và cảm nhận, nhưng nếu bất kỳ ai cũng cần một sự chuyển đổi tùy chỉnh của một chế độ xem khác, chỉ thực hiện một hoạt động hàng đầu, cách tiếp cận sau đây có thể hữu ích.

Vì vậy, nếu bạn mong đợi một cái gì đó như sau

phương thức SwiftUI tùy chỉnh

Đây là một mã đơn giản để giới thiệu cách tiếp cận (có thể thay đổi các tham số chuyển động & hoạt hình có thể thay đổi theo ý muốn)

struct ModalView : View {
    @Binding var activeModal: Bool
    var body : some View {
        VStack {
            Button(action: {
                withAnimation(.easeInOut(duration: 0.3)) {
                    self.activeModal = false
                }
            }) {
                Text("Hide modal")
            }
            Text("Modal View")
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Color.green)
    }
}

struct MainView : View {
    @Binding var activeModal: Bool
    var body : some View {
        VStack {
            Button(action: {
                withAnimation(.easeInOut(duration: 0.3)) {
                    self.activeModal = true
                }
            }) {
                Text("Show modal")
            }
            Text("Main View")
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Color.yellow)
    }
}

struct ModalContainer: View {
    @State var showingModal = false
    var body: some View {
        ZStack {
            MainView(activeModal: $showingModal)
                .allowsHitTesting(!showingModal)
            if showingModal {
                ModalView(activeModal: $showingModal)
                    .transition(.move(edge: .bottom))
                    .zIndex(1)
            }
        }
    }
}
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.