เพื่อแสดงเป็นกิริยาช่วย (สไตล์ iOS 13)
คุณเพียงแค่ต้องการความเรียบง่ายsheet
ด้วยความสามารถในการยกเลิกตัวเอง:
struct ModalView: View {
@Binding var presentedAsModal: Bool
var body: some View {
Button("dismiss") { self.presentedAsModal = false }
}
}
และนำเสนอเหมือน:
struct ContentView: View {
@State var presentingModal = false
var body: some View {
Button("Present") { self.presentingModal = true }
.sheet(isPresented: $presentingModal) { ModalView(presentedAsModal: self.$presentingModal) }
}
}
โปรดทราบว่าฉันส่งต่อpresentingModal
ไปยังโมดัลเพื่อให้คุณสามารถยกเลิกมันได้จากโมดอลเอง แต่คุณสามารถกำจัดมันได้
เพื่อให้มีอยู่จริงfullscreen
(ไม่ใช่แค่มองเห็น)
ViewController
คุณจำเป็นต้องเข้าถึง ดังนั้นคุณต้องมีคอนเทนเนอร์ผู้ช่วยและสิ่งต่าง ๆ สิ่งแวดล้อม:
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 }
}
}
จากนั้นคุณควรใช้ implement ส่วนขยายนี้:
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)
}
}
ในที่สุด
คุณสามารถทำให้มันfullscreen
เหมือน:
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
มันเป็นวิธีการมาตรฐานแม้จะอยู่ใน คุณมีเหตุผลพิเศษหรือไม่?