传递变量时SwiftUI中的.sheet奇怪行为 [英] .sheet in SwiftUI strange behaviour when passing a variable

查看:26
本文介绍了传递变量时SwiftUI中的.sheet奇怪行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 SwiftUI 中使用 .sheet 视图,并且在代码执行过程中观察到一个奇怪的行为.

I am using .sheet view in SwiftUI and I am observing a strange behavior in the execution of the code.

我正在查看 SignInView2:

I am having a view SignInView2:

 struct SignInView2: View {

@Environment(\.presentationMode) var presentationMode
@State var invitationUrl = URL(string: "www")
@State private var showingSheet = false


var body: some View {
    VStack {
    Text("Share Screen")
        
        Button(action: {
            print("link: \(invitationUrl)") // Here I see the new value assigned from createLink() 
            self.showingSheet = true
        }) {
            Text("Share")
        }
        .sheet(isPresented: $showingSheet) {
        let invitationLink = invitationUrl?.absoluteString  // Paasing the old value (www)
        ActivityView(activityItems: [NSURL(string: invitationLink!)] as [Any], applicationActivities: nil)
    }
    }
    .onAppear() {
        createLink()
    }
  }
}

当它出现时调用create一个链接方法:

which calls create a link method when it appears:

extension SignInView2 {

func createLink()  {
        guard let uid = Auth.auth().currentUser?.uid else {
        print("tuk0")
            return }

    let link = URL(string: "https://www.example.com/?invitedby=\(uid)")
    print("tuk1:\(String(describing: link))")
    let referralLink = DynamicLinkComponents(link: link!, domainURIPrefix: "https://makeitso.page.link")
    print("tuk2:\(String(describing: referralLink))")
    referralLink?.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.IVANDOS.ToDoFirebase")
    referralLink?.iOSParameters?.minimumAppVersion = "1.0"
    referralLink?.iOSParameters?.appStoreID = "13129650"

    referralLink?.shorten { (shortURL, warnings, error) in
      if let error = error {
        print(error.localizedDescription)
        return
      }
        print("tuk4: \(shortURL)")
        self.invitationUrl = shortURL!
    }
  }
}  

该方法为 invitationUrl 变量分配一个值,该变量被传递到工作表.不幸的是,当工作表出现时,我没有看到新分配的变量,但我只看到了www".你能解释一下如何传递 createLink() 生成的新值吗?

That method assigns a value to the invitationUrl variable, which is passed to the sheet. Unfortunatelly, when the sheet appears, I don't see the newly assigned variable but I see only "www". Can you explain me how to pass the new value generated from createLink()?

推荐答案

这是 sheet 自 SwiftUI 2.0 以来的已知行为.内容是在创建工作表的时间创建的,而不是在显示时间创建的.因此,解决方案可以是使用 .sheet(item:... 修饰符或在工作表内容视图中传递绑定(这是对状态存储的一种引用,不需要更新).

This is known behaviour of sheet since SwiftUI 2.0. Content is created in time of sheet created not in time of showing. So the solution can be either to use .sheet(item:... modifier or passing binding in sheet content view (which is kind of reference to state storage and don't need to be updated).

这是一个可能的方法的演示.使用 Xcode 12.4 准备.

Here is a demo of possible approach. Prepared with Xcode 12.4.

struct SignInView2: View {

    @Environment(\.presentationMode) var presentationMode
    @State private var invitationUrl: URL?     // by default is absent

    var body: some View {
        VStack {
            Text("Share Screen")
            
            Button(action: {
                print("link: \(invitationUrl)")
                self.invitationUrl = createLink()   // assignment activates sheet
            }) {
                Text("Share")
            }
            .sheet(item: $invitationUrl) {
                ActivityView(activityItems: [$0] as [Any], applicationActivities: nil)
            }
        }
    }
}

// Needed to be used as sheet item
extension URL: Identifiable {
    public var id: String { self.absoluteString }
}

这篇关于传递变量时SwiftUI中的.sheet奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆