小编dan*_*ito的帖子

SwiftUI 在列表下方添加视图

我有一个包含一些项目的清单。

在列表下方,我希望必须单击按钮才能加载更多项目。(由于加载所有项目需要一些用户操作,例如输入 TAN,因此当用户滚动到列表末尾时不应自动完成此操作,但前提是他愿意这样做。)

我想要的是这样的视图:

在此输入图像描述

但是,如果我将列表和按钮放在 VStack 中,按钮将始终显示在屏幕底部,而不仅仅是当我滚动到列表末尾时:

struct ContentView: View {
    
    private let items = Range(0...15).map { "Item " + String($0) }
    
    var body: some View {
        VStack {
            List(items, id: \.self) { item in
                Text(item)
            }
            
            HStack {
                Spacer()
                
                Button("Load more") { print("Load more items") }
                
                Spacer()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我将按钮添加到列表中,按钮显然会显示为具有白色背景的列表项,并且列表中没有任何空间:

struct ContentView: View {
    
    private let items = Range(0...15).map { "Item " + String($0) }
    
    var body: some View {
        List {
            ForEach(items, id: \.self) { item …
Run Code Online (Sandbox Code Playgroud)

swiftui

6
推荐指数
1
解决办法
3113
查看次数

用于执行外部进程的 Kotlin 协程

在Java中的传统方法执行外部程序是开始一个新的Process,开始两个线程消耗其inputStreamerrorStream,然后调用其阻塞Process.waitFor()等到外部命令已退出。

如何使用 Kotlin 协程以(几乎)非阻塞方式完成此操作?

我是这样试的。你有什么建议可以改进它吗?

(如何异步读取流,也调用ProcessBuilder.start()in withContext(Dispatchers.IO),对 Dispatchers.IO 的调用是否过多,...?)

    suspend fun executeCommand(commandArgs: List<String>): ExecuteCommandResult {
        try {
            val process = ProcessBuilder(commandArgs).start()

            val outputStream = GlobalScope.async(Dispatchers.IO) { readStream(process.inputStream) }
            val errorStream = GlobalScope.async(Dispatchers.IO) { readStream(process.errorStream) }

            val exitCode = withContext(Dispatchers.IO) {
                process.waitFor()
            }

            return ExecuteCommandResult(exitCode, outputStream.await(), errorStream.await())
        } catch (e: Exception) {
            return ExecuteCommandResult(-1, "", e.localizedMessage)
        }
    }

    private suspend fun readStream(inputStream: InputStream): String {
        val readLines = mutableListOf<String>()

        withContext(Dispatchers.IO) …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines

5
推荐指数
1
解决办法
716
查看次数

HStack 中的 SwiftUI EditButton 未激活编辑模式

作为更大表单的一部分,我希望有一个带有列表的部分,其条目可以重新排序。

在整个视图中,应该只能编辑该特定列表,而不能编辑其他内容。因此我希望将编辑按钮放在列表附近。

如果我只是将 EditButton 设置为节标题,则可以对列表项重新排序,但无法显示节标题:

struct ContentView: View {
    
    private let items = Range(1...4).map { "Item " + String($0) }
    
    var body: some View {
        Form {
            Section(header: EditButton()) {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onMove(perform: reorderItems)
                .onDelete(perform: deleteItems)
            }
        }
    }

    func reorderItems(from sourceIndices: IndexSet, to destinationIndex: Int) { /* ... */ }

    func deleteItems(at offsets: IndexSet) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,如果我将 EditButton 包装在 HStack 中以在右侧显示按钮,则点击“编辑”会将按钮的标题更改为“完成”,但不再启动列表的编辑模式:

struct ContentView: View {

    @Environment(\.editMode) var editMode
    
    private …
Run Code Online (Sandbox Code Playgroud)

swiftui

5
推荐指数
1
解决办法
1965
查看次数

标签 统计

swiftui ×2

kotlin ×1

kotlin-coroutines ×1