【问题标题】:SwiftUI: onDismiss not get calledSwiftUI:onDismiss 不会被调用
【发布时间】:2020-01-26 02:43:45
【问题描述】:

我的问题是,如果我以编程方式关闭视图,.sheet 中的 onDismiss 不会被调用。如果我通常通过向下滑动视图来关闭视图 onDismiss 则正常调用。

视图 1:

HStack {
    Text("Twittere deine Antwort")
    Spacer()
}
.onTapGesture {
    self.showPostCommentView = true
}
.sheet(isPresented: self.$showPostCommentView, onDismiss: {
    self.optionManager.getTweet() // <--- This does not get called
}) {
    PostTweetView(postCommentTweet: self.optionManager.tweet, postTweetImage: self.image, profileImage: self.imageLoader.image)
}

视图 2:

@Environment(\.presentationMode) private var presentationMode

Button(action: {
     // some async operations... When finished completion gets called
     self.tweetManager.sendTweet(completion: { self.presentationMode.wrappedValue.dismiss() })
}) {
    Text("Twittern")
}

【问题讨论】:

  • 这似乎是预期的行为?如果您自己关闭工作表,则不需要回调告诉您已关闭工作表。
  • 我想运行代码,当我以编程方式关闭它时,用新数据刷新列表。那我该怎么办?
  • 只需在您的 Twittern 按钮中运行代码。我也认为这是预期的行为 - 当您以编程方式关闭(例如保存更改)和用户手动关闭(例如撤消)时,您可能想要做不同的事情
  • @LuLuGaGa Twittern 按钮在一个单独的视图中,我在另一个视图中刷新。
  • 是的,但您肯定会在驱动两个视图背后的数据的 ObservedObject 上刷新?

标签: ios swift swiftui xcode11 swift5


【解决方案1】:

@escaping 闭包添加到您的PostTweetView,并将您的onDismiss 代码添加到闭包。确保 PostTweetView 中的 init 也分配了所有局部变量:

PostTweetView:

@Environment(\.presentationMode) private var presentationMode
var onDismiss: () -> Void
init(/* All the other local variables in this view */ onDismiss: @escaping () -> Void) {
    // initialize all the other local variables
    self.onDismiss = onDismiss
}

Button(action: {
    // some async operations... When finished completion gets called
    self.tweetManager.sendTweet(completion: { 
        self.presentationMode.wrappedValue.dismiss()
        self.onDismiss()
    })
}) {
    Text("Twittern")
}

view1 来自您原来的问题:

HStack {
    Text("Twittere deine Antwort")
    Spacer()
}
.onTapGesture {
    self.showPostCommentView = true
}
.sheet(isPresented: self.$showPostCommentView, onDismiss: {
    self.optionManager.getTweet() // <--- This does not get called
}) {
    PostTweetView(postCommentTweet: self.optionManager.tweet, postTweetImage: self.image, profileImage: self.imageLoader.image) {
        self.optionManager.getTweet()
    }
}

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多