小编Qua*_*ntm的帖子

UIView上面介绍了SKScene - 为什么触摸始终会到达现场?

我有一个令人困惑的情况.首先,这是代码:

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)

谢谢你的帮助.

touch ios sprite-kit swift

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

SwiftUI 和数据模型 (CoreData) - 如何更改数据?

我对如何使用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子类,因为它符合 …

binding core-data ios swift swiftui

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

Swift 3核心数据 - NSExpression forFunction:"sum:"抛出错误("无法将字典转换为Day")

我有日子和任务.一天有很多任务.每个任务都有一个名为"点"的属性,我想总结当天任务的所有点.我使用下面的代码(在教程中的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)

core-data swift swift3

4
推荐指数
1
解决办法
1219
查看次数

无法在xml文件中获取root元素的子元素

我有一个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)

c# xml linq

4
推荐指数
1
解决办法
51
查看次数

在 .onAppear 中切换动画时,SwiftUI 出现意外动画(使用 GeometryReader 的大小)

我有一个奇怪的动画行为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)
我的期望 不需要的动画 1 不需要的动画2
在此输入图像描述 在此输入图像描述 在此输入图像描述
import SwiftUI

struct TestView: View {
    @State private var show = false
    @State …
Run Code Online (Sandbox Code Playgroud)

animation ios swift swiftui

4
推荐指数
1
解决办法
1437
查看次数

@IBDesignables - "代理商崩溃"但应用程序仍然有效(大部分时间)

我对项目有一个非常奇怪的问题.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)

xcode ios swift

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

在更新正在UITableView中显示的CoreData模型后,应用程序崩溃

我有一个奇怪的错误,非常罕见,但导致应用程序崩溃.我无法重现它,但我终于找到了一份记录此事件的崩溃报告.(我在下面发布了堆栈跟踪.我使用了截图,因为这里的引号函数搞砸了格式化.这将是不可读的)

因此,在点击调用该方法的按钮后,问题就开始了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数据库.

现在,上下文的一点:该ExtendBitPopupViewpopup上面一个淡入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)

core-data ios swift

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

符合带有关联值的类型的协议

我有以下片段:

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)

protocols swift

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

阅读许多元素 - 如何避免if(...!= null)混乱?(嵌套)

我在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#中有等价物吗?

谢谢!

c# xml

0
推荐指数
1
解决办法
79
查看次数

标签 统计

swift ×7

ios ×5

core-data ×3

c# ×2

swiftui ×2

xml ×2

animation ×1

binding ×1

linq ×1

protocols ×1

sprite-kit ×1

swift3 ×1

touch ×1

xcode ×1