是否已替换过时的PresentationLink? (Xcode 11 beta 4)

时间:2019-07-17 22:13:28

标签: swiftui

在Xcode beta 4中,使用PresentationLink会给出以下警告:“已弃用'PresentationLink':请改用.sheet修饰符。”

我假设它们表示

的某种形式
func sheet<Content>(isPresented: Binding<Bool>, onDismiss: (() -> Void)? = nil, content: @escaping () -> Content) -> some View where Content : View

但是我不确定如何切换到此模式-特别是isPresented参数使我感到困惑。我知道有一个名为isPresented的Environment变量,但是对于当前View来说,这不是吗,不是要呈现的View吗?

我对此最感兴趣,因为我希望这可以解决PresentationLinks仅工作一次的问题(请参阅swiftUI PresentaionLink does not work second time

现在不赞成使用PresentationLink的人可以提供一个简单的示例来显示视图吗?例如,将以下内容转换为使用.sheet修饰符:

  NavigationView {
        List {
            PresentationLink(destination: Text("Destination View")) {
                Text("Source View")
            }
        }
    }

4 个答案:

答案 0 :(得分:4)

下面是一个示例,与您的示例非常接近。

import SwiftUI

struct Testing : View {
    @State var isPresented = false

    var body: some View {
        NavigationView {
            List {
                Button(action: { self.isPresented.toggle() })
                    { Text("Source View") }
                }
            }.sheet(isPresented: $isPresented, content: { Text("Destination View") })
    }
}

这确实确实可以解决您所引用的有关PresentationLinks not working the second time的错误

答案 1 :(得分:2)

您应该能够像这样更新代码

struct MainScreen: View {
    @State var shown = false

    var body: some View {

        VStack{
            Button(action: {
                self.shown.toggle()
            }) {
                Text("Press me to present")
            }
        }.sheet(isPresented: $shown) { () -> SecondScreen in

            return SecondScreen(dismissFlag: self.$shown)
        }


    }
}


struct SecondScreen: View {

    @Binding var dismissFlag: Bool

    var body: some View {

        VStack{
            Button(action: {

                self.dismissFlag = false

            }) {
                Text("Second screen, click to exit")
            }
        }


    }
}

关于环境变量isPresented,您可以使用该方法,并且应该可以在SecondScreen视图中设置isPresented?.value = false,但是我无法在Beta 4中使它起作用我已经在Beta 3中使用了这种方法。

答案 2 :(得分:1)

在当前方法稳定之前,我将使用这些代码?

UIApplication.shared.windows[0].rootViewController!.present(UIHostingController(rootView: view), animated: true, completion: nil)
UIApplication.shared.windows[0].rootViewController!.dismiss(animated: true, completion: nil)

({.sheet在使用VStackList时似乎已损坏或难以使用)

答案 3 :(得分:0)

我建议使用导航链接

    // GET api/Picture/lower_0000_012
    [HttpGet("{id}")]
    public async Task<IActionResult> GetPictureAsync(string id)
    {
        var res = Task.Run(() => _repo.GetPictureSet(id));
        return Ok(await res);
    }

this文章中的更多详细信息