我有一个令人困惑的情况.首先,这是代码:
class MyView: SKView {
...
public override func awakeFromNib() {
super.awakeFromNib()
let gameScene = MyGameScene(...)
// ...
presentScene(gameScene)
let view = UIView()
view.frame = bounds
view.isUserInteractionEnabled = true
addSubview(view)
}
...
}
class MyGameScene: SKScene {
...
public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch received")
}
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个SKView提出来的SKScene.在呈现之后,我添加了一个UIView填满屏幕的内容.然而,当我启动应用程序并点击屏幕时,会打印"触摸接收",这意味着触摸到达了场景,应该在后面view.这是为什么?
我该怎么做才能防止它呢?
我还尝试在视图中添加手势识别器.但是它并没有阻止这个问题(即使我设置cancelsTouchesInView为true)
谢谢你的帮助.
我对如何使用Core Datawith感到非常困惑SwiftUI。关于它的文章有很多,但每个人都只是展示精心设计的完美运作的情况。没有人展示稍微复杂的东西,我无法弄清楚。我已经尝试了两周了 (我能够对其进行编码,以便让它简单地工作;但是,我正在尝试找到一种良好且务实的方法,这就是我正在努力解决的问题)。
这是一个例子:
struct CarView: View {
@State var car: Car
struct Car {
let id: UUID = UUID()
let name: String
let price: Int
}
var body: some View {
VStack {
Text(car.name)
Text("\(car.price)")
}
}
}
struct CarView_Previews: PreviewProvider {
static var previews: some View {
CarView(car: .init(name: "Tesla Model X", price: 42))
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的构造,也很容易测试和处理,因为您可以简单地创建一个虚拟Car实例来使用 XCode Previews。
但是,如果您想向其中添加一个从数据库中提取数据的数据模型,会发生什么情况呢?假设你有一个CarManagedObject NSManagedObject子类。您如何将其连接到我们的SwiftUI视图?
您可以简单地将Car结构替换为CarManagedObject子类,因为它符合 …
我有日子和任务.一天有很多任务.每个任务都有一个名为"点"的属性,我想总结当天任务的所有点.我使用下面的代码(在教程中的Core Data,swift 2版本中找到)并尝试修改它为swift 3(我还添加了一个谓词,但这并不重要).但是当我运行此代码时,我收到此错误:
无法将'NSKnownKeysDictionary1'(0x10d02d328)类型的值转换为'MyProject.Day'
我究竟做错了什么?
// sum current day's task points
let sumRequest: NSFetchRequest<Day> = Day.fetchRequest()
sumRequest.resultType = .dictionaryResultType
sumRequest.predicate = NSPredicate(format: "SELF == %@", argumentArray: [Project.Days.current])
let expressionDescription = NSExpressionDescription()
expressionDescription.name = "sumOfPoints"
expressionDescription.expression = NSExpression(forFunction: "sum:", arguments: [NSExpression(forKeyPath: "tasks.points")])
expressionDescription.expressionResultType = .integer16AttributeType
sumRequest.propertiesToFetch = [expressionDescription]
do {
let results = try managedObject.fetch(sumRequest) as! [NSDictionary] // Here's the line that causes the error
print("DEN:", results)
} catch let error as NSError {
print("DEN:", error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)
我认为这与这一行有关:
let sumRequest: …Run Code Online (Sandbox Code Playgroud) 我有一个xml文件,结构如下:
<textureatlas xmlns="http://www.w3.org/1999/xhtml" imagepath="someImage.png">
<subtexture name="1" x="342" y="0" width="173" height="171"></subtexture>
<subtexture name="2" x="0" y="346" width="169" height="173"></subtexture>
<subtexture name="3" x="0" y="173" width="169" height="173"></subtexture>
<subtexture name="4" x="0" y="0" width="169" height="173"></subtexture>
<subtexture name="5" x="342" y="171" width="169" height="173"></subtexture>
<subtexture name="6" x="169" y="0" width="173" height="171"></subtexture>
<subtexture name="7" x="169" y="173" width="173" height="171"></subtexture>
<subtexture name="8" x="169" y="346" width="173" height="171"></subtexture>
<subtexture name="9" x="342" y="346" width="173" height="171"></subtexture>
</textureatlas>
Run Code Online (Sandbox Code Playgroud)
我希望迭代遍历每个subtexture元素,使用Linqin C#.但是,我的代码不起作用:
var document = XDocument.Load(pathToXml);
var root = document.Root;
if (root == null)
{
throw …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的动画行为SwiftUI。我尝试创建一个最小视图来演示它,如下所示。
我想用淡入淡出和缩放效果制作三个圆圈的动画(请参阅下面的“我的期望”栏)。但是,圆圈的大小取决于视图的宽度,因此我使用 aGeometryReader来实现。
我想在 中启动动画.onAppear(perform:),但在调用时,GeometryReader尚未设置size属性。我最终得到的是你在“Unwanted Animation 1”中看到的动画。这是因为帧被动画化为.zero正确的尺寸。
但是,每当我尝试通过添加修改器来禁用帧的动画时.animation(nil, value: size),我都会得到极其奇怪的动画行为(请参阅“不需要的动画 2”)。这一点我完全不明白。它以某种方式为动画添加了水平平移,这使得它看起来更糟糕。您知道这里发生了什么以及如何解决这个问题吗?
奇怪的是,如果我使用如下所示的显式动画,一切都会正常工作:
.onAppear {
withAnimation {
show.toggle()
}
}
Run Code Online (Sandbox Code Playgroud)
但我想了解这里发生了什么。
谢谢!
替换.onAppear(perform:)为以下代码是否合理?这只会在视图的生命周期中触发一次,即当size更改.zero为正确值时。
.onChange(of: size) { [size] newValue in
guard size == .zero else { return }
show.toggle()
}
Run Code Online (Sandbox Code Playgroud)
import SwiftUI
struct TestView: View {
@State private var show = false
@State …Run Code Online (Sandbox Code Playgroud) 我对项目有一个非常奇怪的问题.XCode一直给我红色错误,并说我的IBDesignables有问题.但错误消息每次都不同,并且它总是受到另一个视图控制器的影响.我不知道如何找到问题的原因.它似乎与我创建的所有IBDesignables随机发生.
该应用程序仍然有效.虽然,有时它不能正确渲染一些视图(我有自定义绘制蒙版的视图).它很少发生,但确实发生了.
这些是我得到的错误:
"无法更新自动布局状态:代理程序崩溃"
"无法呈现和更新{随机选择的VC名称}的自动布局状态:代理程序崩溃"
一旦我点击它,后者就会消失.有时,当我进入故事板时,所有错误都会消失.当我打开任何其他文件时,我会收到多个红色错误(有时像3,有时是6或更多).
我检查了崩溃日志.他们中的每一个都说:
致命错误:在展开Optional值时意外发现nil
我不确定这意味着什么.
我尝试清理项目并重新启动XCode.另外,我实现了所有init方法.
以下代码是class(几乎)始终是我得到的错误的一部分.此外,它是自定义绘制的视图,有时无法正确呈现:
import UIKit
struct TriangleViewLabelDefault {
static let triangleWidth: CGFloat = 20
static let triangleHeight: CGFloat = 10
}
@IBDesignable
class TriangleView: UIView {
let DEFAULT_TRIANGLE_WIDTH: CGFloat = 30
let DEFAULT_TRIAGNLE_HEIGHT: CGFloat = 20
struct Triangle {
static var width: CGFloat = TriangleViewLabelDefault.triangleWidth
static var height: CGFloat = TriangleViewLabelDefault.triangleHeight
static var midXPosition: CGFloat = 0
}
@IBInspectable var triangleWidth: CGFloat = TriangleViewLabelDefault.triangleWidth {
didSet {
Triangle.width …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的错误,非常罕见,但导致应用程序崩溃.我无法重现它,但我终于找到了一份记录此事件的崩溃报告.(我在下面发布了堆栈跟踪.我使用了截图,因为这里的引号函数搞砸了格式化.这将是不可读的)
因此,在点击调用该方法的按钮后,问题就开始了closeButtonTapped.
该方法应该淡出popup-view(调用ExtendBitPopupView)并保存用户输入的文本(details我的一个数据模型的属性).这是closeButtonTapped方法:
func closeButtonTapped(tap: UITapGestureRecognizer) {
fadeOut { // fadeOut(completion:) just fades out the UI
if self.infoTextView.text != "Enter details..." {
self.entry.info = self.infoTextView.text
self.appDelegate.saveContext()
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,它需要用户输入的文本并将其保存为entry.info数据库.
现在,上下文的一点:该ExtendBitPopupView是popup上面一个淡入UITableView显示所有entry对象有在数据库中.它使用a NSFetchedResultsController来管理数据.该表未显示该entry.info属性.这只能在里面看到ExtendBitPopupView
根据堆栈跟踪,应用程序在调用controllerDidChange方法时崩溃.我猜它会调用这个方法因为entry已经改变了.
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type { …Run Code Online (Sandbox Code Playgroud) 我有以下片段:
protocol MyProtocol: Identifiable where ID == UUID {
var id: UUID { get }
}
var test: [MyProtocol] = []
Run Code Online (Sandbox Code Playgroud)
协议“MyProtocol”只能用作通用约束,因为它具有 Self 或关联类型要求
为什么这不起作用?不应该where ID == UUID消除错误所涉及的歧义吗?我在这里错过了什么吗?
我认为这个问题类似于这个问题:Usage of protocols as array types and function parameters in swift
但是,我会认为添加where ID == UUID应该可以解决问题?为什么不是这样?
谢谢!
因此,在试验SwiftUI和构建数据模型时出现了这个问题。我一直将类用于任何类型的数据模型,但似乎SwiftUI想让您尽可能频繁地使用结构(我仍然不知道这在现实中是如何可能的,但这就是我尝试使用它的原因)。
在这种特殊情况下,我尝试让管理器包含所有符合MyProtocol. 例如:
protocol MyProtocol: Identifiable where ID == UUID {
var id: UUID { get }
}
struct A: MyProtocol { // First …Run Code Online (Sandbox Code Playgroud) 我在C#项目中使用Microsoft Linq读取xml文件.我从xml文档访问数据,如下所示:
document.Root.Element("myElement").Attribute("myAttribute").Value
Run Code Online (Sandbox Code Playgroud)
我收到警告,这可能会导致NullReferenceException.我必须检查null)(对于我想要阅读的每个元素和属性).
但是,我不希望有很多嵌套if检查,如下所示:
if (... != null) {
if (... != null) {
if (... != null) {
if (... != null) {
if (... != null) {
...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很快变得丑陋.有更好的方法C#吗?在Swift,有一种称为保护声明的东西,在这种情况下是理想的.它还允许"强制解包"这些东西,这告诉编译器这不能为空.C#中有等价物吗?
谢谢!