小编Con*_*ers的帖子

修复来自 DatePicker 的数百行警告重新布局约束

在 SwiftUI 中使用新的 (iOS 14) DatePicker,它按预期工作并且在模拟器和设备上看起来很好,但是一旦日历弹出,我会在输出窗口中收到几行警告。这是一个有点讨厌!

虽然日志贴在下面,但看似相关的内容似乎是:

    UIDatePicker 0x7fbd66fc49f0 is being laid out below its minimum width of 280. This may not look like expected, especially with larger than normal font sizes.
Run Code Online (Sandbox Code Playgroud)

但是,正如下面的代码所示,我不限制任何小于 300 点的内容。而且,一切都显示正常。

从我的角度来看,两种解决方案中的任何一种都可以正常工作:

  • 禁止所有警告,或
  • 向代码添加任何修复以消除警告

弹出日期选择器的代码,一旦点击控件就会生成所有警告:

struct MyCustomDatePicker : View {
    var doSomething : (Date) -> ()
    @State var title: String
    @State var ignoreSelStart : Bool
    @State var ignoreSelEnd : Bool
    @State var selectedDate : Date
    @ObservedObject var limits : DateRangeLimits
     
    var body: …
Run Code Online (Sandbox Code Playgroud)

datepicker suppress-warnings swiftui

10
推荐指数
1
解决办法
475
查看次数

将项目从一个列表拖动到 SwiftUI 中的另一个列表

我有两个列表,每个列表都有简单的项目。我可以重新排列列表中的项目,代码如下所示。我希望能够从一个列表中拖动一个项目并将其放入另一个列表中。不确定我需要启用什么才能实现这一点。照原样,我可以从一个列表中将某些内容拖到整个屏幕上,但是除了它自己的列表之外,我不能将它放在任何地方;如果我在其他任何地方释放阻力,它就会飞回原来的位置。

显然,我需要添加一些东西来启用所需的行为;关于所需内容的任何想法(不一定使用.onMove- 在同一列表中)将不胜感激。

struct ContentView: View {
    @State private var users1 = ["AAA", "BBB", "CCC"]
    @State private var users2 = ["DDD", "EEE", "FFF"]
    @State private var isEditable = true

    var body: some View {
        HStack {
            Spacer()
            List {
                ForEach(users1, id: \.self) { user in
                    Text(user)
                        .background(Color(.yellow))
                }
                .onMove(perform: move1)
            }
            .environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive))
            Spacer()
            List {
                ForEach(users2, id: \.self) { user in
                    Text(user)
                        .background(Color(.orange))
                }
                .onMove(perform: move2)
            }
            .environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive)) …
Run Code Online (Sandbox Code Playgroud)

drag ios swiftui

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

重新排序 UITableView:当用户第一次开始使用手柄拖动时的通知

我有一个带有单元格的 UITableView,我希望用户能够通过使用每个单元格右侧的“手柄”上下拖动它们来重新排序。我不想实现“拖放”功能,因为这些单元格后面的数据在这个表之外没有任何意义(考虑到表视图及其单元格后面的数据,实现 NSItemProvider 看起来是一个丑陋的过程)。到目前为止,一切都已实施并运行良好。看起来有点像这篇文章的结果。

下一步是,我想知道用户何时“抬起”或开始移动单元格——类似于使用拖放时的dragStateDidChange能力。我什至想在单元格移出其位置之前收到此通知——因为 UI 将单元格背景变成白色并将其“抬高”到表格上方。

如何在不实施“拖放”的情况下获得此通知?

我尝试过的事情没有完成我想要的:

  • 识别长按手势:我确实在这些单元格上使用手势识别器进行点击等;似乎当用户触摸拖动手柄以重新排列单元格时,此操作不会触发长按手势。试过了,没有成功。
  • Will-select-row-at:我func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?在 UITableViewDelegate 代码中实现了该功能;当用户触摸拖动手柄时不会调用它。
  • targetIndexPathForMoveFromRowAt:func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath当拖动的单元格改变位置时触发该函数,但直到那时才会触发;它没有捕捉到我正在寻找的提升/拖动过程的开始。
  • 同样,也不会调用 willBeginEditingRowAt 和 shouldHighlightRowAt。
  • 各种 scrollView 函数:它们都在用户滚动整个表格时调用,而不是在用户重新排序时调用。
  • 注意“设置编辑”:拖动手柄需要始终存在,因此“编辑”始终设置为 true。
  • 有点类似的问题,不幸的是没有我可以使用的答案(也不是在 Swift 中)。

我怀疑必须有一个简单的通知,即单元格已被提起并正在使用手柄拖动,即使它尚未移动到足够远以高于或低于其旧位置。毕竟,操作系统“知道”这一点,因为它会改变背景并添加阴影等等。任何访问该通知以便其他代码也可以对其做出响应的帮助将不胜感激!

uitableview ios swift

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

列出(仅)文件夹中的子文件夹-Swift 3.0 / iOS 10

我试图获取文件夹(应用程序的Documents目录,在下面的示例中)中所有子文件夹的列表。下面的代码成功地找到了文件夹中的所有内容(文件和文件夹都存在),并且还找到了具有指定.text扩展名的文件,但是我无法将结果缩小为子目录的列表。

let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]

var r = "Directory Listing:\n------------------\n" // r = will be returned (or displayed in this case)

do {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: myDocumentsDirectory, includingPropertiesForKeys: nil, options: [])

    // all files -- works fine
    let allFileNames = directoryContents.map{ $0.deletingPathExtension().lastPathComponent }
    r += "All file names:\n\(allFileNames)\n\n"

    // filtering for text files -- also works fine
    let textFiles = directoryContents.filter{ $0.pathExtension …
Run Code Online (Sandbox Code Playgroud)

subdirectory ios swift

3
推荐指数
1
解决办法
2265
查看次数

如何阻止 SwiftUI Picker 对其可见区域外的触摸做出反应?

我在视图中有一个选择器,我希望将其限制为定义的高度和宽度。虽然下面的代码在视觉上实现了这一点,但选择器响应其区域外的点击操作——在某些情况下,响应点击附近的按钮,就像我点击以将选择器滚动到其值的开头或结尾一样。(按钮不响应点击;选择器会响应。但是当点击靠近 - 但在 - 选择器之外 - 没有控制的地方时,也会发生这种情况。)

选择器似乎对上方、下方和侧面的触摸都有反应。当视图足够大(全屏或 2/3 屏幕)时,效果变得不那么明显,但是当整个应用程序只获得屏幕的 1/3 以及选择器的宽度时——作为视图的函数几何体——变小,其他控件也靠得更近,使用起来变得非常困难。

如何让 Picker 忽略其可见区域之外的所有触摸?

Picker(selection: self.$monthSelector, label: Text("Month")) {
   ForEach(0 ..< 12, id: \.self) {
      Text(self.monthNames()[$0])
         .foregroundColor(  Color.black )
      }
   }
      .labelsHidden()
       // THE FOLLOWING 2 STATEMENTS *IN CONJUNCTION* SEEM TO GIVE DESIRED Height/Width
      .fixedSize()
      .frame(maxWidth: geometry.size.width * 0.35, maxHeight: 100)
      .clipped()     // seems to accomplish nothing, visually or regarding touches
      .background(Color.white)
      .cornerRadius(10)
Run Code Online (Sandbox Code Playgroud)

我考虑过的事情:

  • 戴上.clipped镜框(此处建议)。没有效果。
  • 这个问题不是 SwiftUI,我无法确定它的真正线索。
  • 本问题讨论扩展按钮的可点击区域。看不到将关键洞察力(“将修饰符应用于按钮的内容而不是按钮本身”)应用于 Picker 的方法——尤其是关于它的高度。 …

picker swiftui

2
推荐指数
2
解决办法
259
查看次数