将状态变量传递到自定义文本字段的正确方法是什么?我希望避免其他方法/观察结果。这不应该起作用吗?
我在示例项目中重新创建了下面的问题。
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) 我希望你们都安全。
我知道这个问题被问了好几次,但没有得到完美的答案。
我只是想从 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 部分时,文本变得模糊。
请检查下图
假设我有如下现有代码:
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。
所以问题是,我如何将来验证我的枚举,以便可以:
也就是说,以下代码不应发出警告:
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) 在 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
在 UIKit 中,您可以执行以下操作:
UIView.animate(withDuration: TimeInterval, animations: {
//animation
}) { (Bool) in
//code which will be executed after the animation
}
Run Code Online (Sandbox Code Playgroud)
SwiftUI 中有没有类似的东西,或者你能想到一个替代品吗?
我有类似的东西:
如您所见,我有一个表格视图,并且在每个表格视图单元格中,我都有一个集合视图。集合视图是水平的(以复制轮播),以便用户可以滑动浏览图像和视频库。这是另一种方式来描绘它:
Controller -> Table View -> Table View Cells -> Collection View (the carousel) -> Collection View Cells (the carousel images/videos)
我想要实现的是当用户滚动浏览表视图时,轮播中的视频自动播放。当然,要做到这一点,需要做到以下几点:
然而,这说起来容易做起来难。我之前问过如何确定视图在屏幕上是否可见,所以我现在知道该怎么做。
我的问题围绕着我应该如何构建我的代码。
在我的控制器类中,我有以下内容:
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) 我想实现以下目标:每当有人触发 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 上运行的下游任务检索通知?
我想做的是:
VC1 -> 呈现 VC2 -> 推送 VC3
这是我想要的正常流程。
之后在后退按钮上(每个 VC 上都有后退按钮)
我需要向用户显示后退:
VC3 -> 现在 VC2 -> VC1
如何在 Swift 5 中实现这种导航?
我刚刚更新到 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)