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; } ?>swift - How to position two lists vertically so that there's only a little space between them? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

swift - How to position two lists vertically so that there's only a little space between them? - Stack Overflow

programmeradmin3浏览0评论

I have a set up where I have two DisclosureGroups and list of items beneath them:

struct HomeView: View
{
    @State private var selectedItem: String?
    
    var body: some View
    {
        VStack
        {
            List
            {
                DisclosureGroupWithButton(title: "Group 1", items: ["Item 1", "Item 2", "Item 3"])
                DisclosureGroupWithButton(title: "Group 2", items: ["Item A", "Item B", "Item C"])
            }
            .listStyle(SidebarListStyle())
            
            List(selection: self.$selectedItem)
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
            .frame(maxHeight: .infinity)
    
        }
    }
}

struct DisclosureGroupWithButton: View
{
    let title: String
    let items: [String]
    @State private var isExpanded: Bool = false
    
    var body: some View
    {
        DisclosureGroup(isExpanded: self.$isExpanded)
        {
            ForEach(items, id: \.self)
            {
                item in Text(item)
            }
            
            Button("Add Item")
            {
                print("\(title) button tapped")
            }
            .buttonStyle(.bordered)
            .padding(.top, 5)
        }
        label:
        {
            Text(self.title)
        }
    }
}

I want to make it so the List at the bottom appears almost directly beneath the two DisclosureGroups with a little space separating them (and no white space), but I am struggling to do so. The obvious solution is to use a spacer after the List, but that does nothing for some reason. I've messed around with the frames of all the elements and nothing changes. I also noticed that the same behavior occurs even when I strip this down to it's very bare elements of simply being two lists:

    struct HomeView: View
{
    @State private var selectedItem: String?
    
    var body: some View
    {
            List
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
            
            List(selection: self.$selectedItem)
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
    }
}

Does anyone know how to accomplish this?

I have a set up where I have two DisclosureGroups and list of items beneath them:

struct HomeView: View
{
    @State private var selectedItem: String?
    
    var body: some View
    {
        VStack
        {
            List
            {
                DisclosureGroupWithButton(title: "Group 1", items: ["Item 1", "Item 2", "Item 3"])
                DisclosureGroupWithButton(title: "Group 2", items: ["Item A", "Item B", "Item C"])
            }
            .listStyle(SidebarListStyle())
            
            List(selection: self.$selectedItem)
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
            .frame(maxHeight: .infinity)
    
        }
    }
}

struct DisclosureGroupWithButton: View
{
    let title: String
    let items: [String]
    @State private var isExpanded: Bool = false
    
    var body: some View
    {
        DisclosureGroup(isExpanded: self.$isExpanded)
        {
            ForEach(items, id: \.self)
            {
                item in Text(item)
            }
            
            Button("Add Item")
            {
                print("\(title) button tapped")
            }
            .buttonStyle(.bordered)
            .padding(.top, 5)
        }
        label:
        {
            Text(self.title)
        }
    }
}

I want to make it so the List at the bottom appears almost directly beneath the two DisclosureGroups with a little space separating them (and no white space), but I am struggling to do so. The obvious solution is to use a spacer after the List, but that does nothing for some reason. I've messed around with the frames of all the elements and nothing changes. I also noticed that the same behavior occurs even when I strip this down to it's very bare elements of simply being two lists:

    struct HomeView: View
{
    @State private var selectedItem: String?
    
    var body: some View
    {
            List
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
            
            List(selection: self.$selectedItem)
            {
                ForEach(["Option 1", "Option 2", "Option 3"], id: \.self)
                {
                    item in Text(item) .tag(item)
                }
            }
    }
}

Does anyone know how to accomplish this?

Share Improve this question edited Feb 17 at 21:40 Ser Pounce asked Feb 17 at 21:19 Ser PounceSer Pounce 14.6k20 gold badges87 silver badges170 bronze badges 3
  • Why have 2 lists then? It seems like you just want one list with 2 sections. – Sweeper Commented Feb 17 at 21:25
  • @Sweeper your suggestion works well, but one thing I fot to include (and I've updated the code) is that the list beneath the disclosuregroups has selection, and when I wrap a section around that, it screws up and turns grey. Is there a way around that do you know? – Ser Pounce Commented Feb 17 at 21:43
  • Please show a minimal reproducible example. Did you wrap a Section around the whole List? You should only have one List, with selection, and in it, two Sections. – Sweeper Commented Feb 17 at 21:48
Add a comment  | 

1 Answer 1

Reset to default 1

It seems like you just want a single List with 2 sections.

List(selection: self.$selectedItem) {
    Section {
        DisclosureGroupWithButton(title: "Group 1", items: ["Item 1", "Item 2", "Item 3"])
        DisclosureGroupWithButton(title: "Group 2", items: ["Item A", "Item B", "Item C"])
    }
    .selectionDisabled()
    
    Section {
        ForEach(["Option 1", "Option 2", "Option 3"], id: \.self) {
            item in Text(item) .tag(item)
        }
    }
}
// .listSectionSpacing(...) // if you want to adjust the spacing
.listStyle(.sidebar)

I put .selectionDisabled() on the first section to prevent selecting things from the first section. If the first section is also selectable, you can use an enum with associated values as the type of selection, and change the tags accordingly. e.g.

enum ListSelection {
    case section1(SomeOtherType)
    case section2(String)
}
发布评论

评论列表(0)

  1. 暂无评论