te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>ios - How to handle dismissToRoot logic in SwiftUI? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

ios - How to handle dismissToRoot logic in SwiftUI? - Stack Overflow

programmeradmin3浏览0评论

I am working on migrating an existing UIKit + UIViewController based app to SwiftUI. The UIKit based implementation creates a stack of different, presented ViewControllers at runtime.

When the user returns to the app using an AppIntent, e.g. when using a Add item, this call is passed to the SceneDelegate which makes sure, the complete stack of presented ViewControllers is dismissed and than presents the AddItemViewController on the RootVC.

How can the same be done, when switching to SwiftUI views? Is there a similar easy way to dismiss all presented subviews?


Details:

Since the SceneDelegate knows the RootVC, it can simply call .dismiss(...) on it. It could use the .presentedViewController property to walk the presentation stack up to the top and dimiss the VCs from there.

In SwiftUI on the other hand, there are no SubVCs but simply views which are presented as .fullScreenCover, .sheet, etc.

Since every view is completely free how its view model is anized, there is not standardized way to check if any sub views are presented or not, is there?

Lets assume the apps root view is container, e.g. like a tab bar, holding different sub views. This root view can not simple call a dismiss method on all its child views to dismiss any (possibly) presented sub views.

If these are custom views I could adapt the views of course. But what if third party views come into play, where the RootView does not know if sub views are presented or not?

struct TheRootView: View {
    @State private var showDetail: Bool = false
    
    var body: some View {
        VStack {
            Button("Go to Detail") {
                showDetail = true
            }
            .padding()
            .fullScreenCover(isPresented: $showDetail) {
                ADetailView(showing: $showDetail)
            }
            
            ThirPartyView()
        }
    }
}

struct ADetailView: View {
    @State private var showMoreDetails: Bool = false
    @Binding var showing: Bool
    
    var body: some View {
        VStack {
            Button("Show more Details") {
                showMoreDetails = true
            }
            .padding()
            .fullScreenCover(isPresented: $showMoreDetails) {
                Text("More Details")
                Button("Close") {
                    showMoreDetails = false
                }
            }
            
            Button("Close") {
                showing = false
            }
        }
    }
}

struct ThirPartyView: View {
    @State var showCover: Bool = false
    
    var body: some View {
        Button("Do something") {
            showCover = true
        }
        .fullScreenCover(isPresented: $showCover) {
            Button("Close") {
                showCover = false
            }
        }
    }
}

In this example TheRootView knows when ADetailView is presented and can simply dismiss it. But it does not know, if ThirPartyView has presented a sub view.

Is there any way TheRootView could check this (without changing ThirPartyView) and dismiss these presented subviews?

发布评论

评论列表(0)

  1. 暂无评论