Để hiển thị một phương thức (kiểu iOS 13)
Bạn chỉ cần một đơn giản sheet
vớ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 presentingModal
phươ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ó fullscreen
như:
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
}
}
}
}
UIKit
. Bạn có bất kỳ lý do đặc biệt?