标签: swift5

将状态/绑定传递给 UIViewRepresentable

将状态变量传递到自定义文本字段的正确方法是什么?我希望避免其他方法/观察结果。这不应该起作用吗?

我在示例项目中重新创建了下面的问题。

import SwiftUI

struct ParentView: View {
    @State var text: String = "initial"
    var body: some View {
        VStack {
            ChildView(text: $text)
            Text(self.text)
        }
    }
}
struct ChildView: View {
    @Binding var text: String
    var body: some View {
        MyTextField(text: $text).frame(width: 300, height: 40, alignment: .center)
    }
}

struct MyTextField: UIViewRepresentable {
    @Binding var text: String
    func makeUIView(context: Context) -> UITextField {
        let view = UITextField()
        view.borderStyle = UITextField.BorderStyle.roundedRect
        return view
    }
    func updateUIView(_ uiView: UITextField, context: Context) { …
Run Code Online (Sandbox Code Playgroud)

ios swift swift5

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

如何从 UIView 捕获高分辨率图像

我希望你们都安全。

我知道这个问题被问了好几次,但没有得到完美的答案。

我只是想从 UIView 中捕获高分辨率的图像,主要是图像不应该是模糊的。

我已经尝试过这段代码

extension UIView {
    func asImage() -> UIImage {
            let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
            let capturedImage = renderer.image {
                (ctx) in
                self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
            }
            return capturedImage
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我捕获图像并缩放时,文本变得模糊。

提前致谢

编辑 我正在尝试从 UIView 创建高分辨率图像。当我缩放图像的 1 部分时,文本变得模糊。

请检查下图

在此输入图像描述

resolution image ios swift swift5

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

版本控制系统未提供作者信息

我刚刚将Xcode更新为版本10.2(10E125)。

我想提交的那一刻,我收到以下消息:

在此处输入图片说明

单击修复后:

在此处输入图片说明

我已经填写了信息,但是我仍然在上面收到该信息。

什么原因?

git xcode swift xcode10 swift5

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

在swift 5枚举中使用@unknown默认值:如何抑制“将永远不会执行默认值”警告?

假设我有如下现有代码:

enum SomeEnumCases {
  case existing
  case alreadyExisting
}

func doSomething(withEnums enumCase: SomeEnumCases) {
  switch enumCase {
  case .existing:
    print("This case was already existing")
  case .alreadyExisting:
    print("This case was already existing too...")
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果要为枚举添加新的大小写,则上面的函数将显示一个编译错误,表明切换大小写必须是详尽无遗的,并且我将被迫处理新的丢失大小写。我会在switch语句中添加第三种情况,或添加默认语句。

现在,为了处理这种无法预料的枚举案例,我想@unknown default在上面的现有函数中添加一个案例。唯一的问题是,现在这将给我警告Default will never be executed

所以问题是,我如何将来验证我的枚举,以便可以:

  1. 详尽地处理所有当前枚举的情况,并且
  2. 对未来的未知案例具有默认的处理机制,并且
  3. 仅当添加了新的案例并且这些案例必须由默认案例处理时,才显示警告。

也就是说,以下代码不应发出警告:

enum SomeEnumCases {
  case existing
  case alreadyExisting
}

func doSomething(withEnums enumCase: SomeEnumCases) {
  switch enumCase {
  case .existing:
    print("This case was already existing")
  case .alreadyExisting:
    print("This case was already existing …
Run Code Online (Sandbox Code Playgroud)

enums warnings swift swift-playground swift5

9
推荐指数
1
解决办法
1007
查看次数

在 Swift Combine 中使用 Publishers.debounce() 的正确语法是什么?

在 Apple 的 2019 年 WWDC 视频中Swift Combine in Practice,他们演示了使用debounce发布者来减慢消息速度。

return $username
  .debounce(for: 0.5, scheduler: RunLoop.main)
  .removeDuplicates()
  .eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试以类似的方式使用它时,都会出现以下错误:

无法使用类型为“(for:Double,调度程序:RunLoop)”的参数列表调用“debounce”

debounce()签名是:

public func debounce<S>(for dueTime: S.SchedulerTimeType.Stride, 
                          scheduler: S,
                            options: S.SchedulerOptions? = nil) -> 
                                    Publishers.Debounce<Self, S> where S : Scheduler
Run Code Online (Sandbox Code Playgroud)

SchedulerTimeType.Stride 似乎可以用数字初始化,但它对我不起作用,或者我对 Swift 泛型缺乏经验。

调用它的正确方法是什么?

编辑

重复这个问题...

目前,搜索诸如“组合”之类的通用词相当具有挑战性......

macOS 10.15,Xcode 11

swift swift5 combine

9
推荐指数
1
解决办法
5533
查看次数

有没有办法在 SwiftUI 中的动画之后执行函数?

在 UIKit 中,您可以执行以下操作:

UIView.animate(withDuration: TimeInterval, animations: {
    //animation
  }) { (Bool) in
    //code which will be executed after the animation
}
Run Code Online (Sandbox Code Playgroud)

SwiftUI 中有没有类似的东西,或者你能想到一个替代品吗?

ios swift swift5 swiftui xcode11

9
推荐指数
1
解决办法
708
查看次数

当单元格可见时在轮播中播放视频

我有类似的东西:

在此处输入图片说明

如您所见,我有一个表格视图,并且在每个表格视图单元格中,我都有一个集合视图。集合视图是水平的(以复制轮播),以便用户可以滑动浏览图像和视频库。这是另一种方式来描绘它:

Controller -> Table View -> Table View Cells -> Collection View (the carousel) -> Collection View Cells (the carousel images/videos)

我想要实现的是当用户滚动浏览表视图时,轮播中的视频自动播放。当然,要做到这一点,需要做到以下几点:

  1. 检查集合视图是否在屏幕上可见。
  2. 检查可见的集合视图单元格是否是视频(并非集合视图中的所有单元格都是视频,有些是图像)。
  3. 确保两个单独的表格视图单元格中的两个视频不同时播放。只有第一个可见的表格视图单元格应该有一个正在播放的视频。

然而,这说起来容易做起来难。我之前问过如何确定视图在屏幕上是否可见,所以我现在知道该怎么做。

我的问题围绕着我应该如何构建我的代码。

在我的控制器类中,我有以下内容:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    isCollectionViewVisible()
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if (!decelerate) {
        isCollectionViewVisible()
    }
}

func isCollectionViewVisible() {
    for visibleCell in self.tableView.visibleCells {
        guard let cell = visibleCell as? MyTableViewCell else {
            continue
        }

        if let myCollectionView = cell.collectionView {
            let visibleRect = …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift swift4 swift5

9
推荐指数
1
解决办法
979
查看次数

如何:使用 Combine 在后台对 CoreData 更改做出反应

我想实现以下目标:每当有人触发 CoreData 保存(即NSManagedObjectContextDidSave发送通知)时,我想根据更改的 NSManagedObject执行一些后台计算。具体示例:假设在一个笔记应用程序中,我想异步计算所有笔记中的总字数。

当前的问题在于 NSManagedObject 上下文显式绑定到线程,并且不鼓励您NSManagedObject在该线程之外使用s。

NSManagedObjectContext在我的 s 中设置了两个SceneDelegate

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let backgroundContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.newBackgroundContext()
Run Code Online (Sandbox Code Playgroud)

我也都签署通过的通知NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave),并正在接收保存的通知两次我只触发后一个 managedObjectContext.save()。但是,这两个通知都是从同一个线程(即 UIThread)发送的,并且NSManagedObjects用户字典中的所有通知都有一个.managedObjectContext是 theviewContext而不是backgroundContext

我的想法是根据关联NSManagedObjectContext是否为后台来过滤通知,因为我认为通知也是在(私有)DispatchQueue 上发送的,但似乎所有通知都是在 UIThread 上发送的,并且从未使用过后台上下文.

关于如何解决这个问题的任何想法?这是一个错误吗?如何根据backgroundContext正在关联的 DispatchQueue 上运行的下游任务检索通知?

core-data ios swift swift5 combine

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

如何从呈现的 ViewController 推送?

我想做的是:

VC1 -> 呈现 VC2 -> 推送 VC3

这是我想要的正常流程。

之后在后退按钮上(每个 VC 上都有后退按钮)

我需要向用户显示后退:

VC3 -> 现在 VC2 -> VC1

如何在 Swift 5 中实现这种导航?

ios swift swift4 swift5

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

SwiftUI - 更改@Published 结构时是否可以触发 didSet?

我刚刚更新到 XCode 11.4,我的一些代码已经停止工作。我@Published在一个ObservableObject. 以前,当我更新结构上的属性时,该didSet方法会触发已发布的属性,但现在情况不再如此。在 Swift 的最新更新中,这种行为是否有可能被设计改变了?

这是一个简单的例子:


import SwiftUI

struct PaddingRect {
  var left: CGFloat = 20
  var right: CGFloat = 20
}

final class SomeStore : ObservableObject {
  @Published var someOtherValue: String = "Waiting for didSet"

  @Published var paddingRect:PaddingRect = PaddingRect() {
    didSet {
      someOtherValue = "didSet fired"
    }
  }
}

struct ObserverIssue: View {
  @ObservedObject var store = SomeStore()

  var body: some View {
    VStack {
      Spacer()

      Rectangle()
        .fill(Color.yellow)
        .padding(.leading, store.paddingRect.left)
        .padding(.trailing, …
Run Code Online (Sandbox Code Playgroud)

ios swift swift5 swiftui observableobject

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