我有一个类似西蒙的记忆游戏,其中播放一系列音调并且用户尝试重复音调.问题是,我不时会听到一声可怕的噼啪声.它可能只是在几个笔记之后或多达二十个.声音都是长度为2秒的wav文件.我循环通过十个玩家,以便没有任何声音被剪裁.(我已经尝试过多达50但是没有任何帮助.)我也尝试过实施,audioPlayerDidFinishPlaying这样我就可以在声音完成后停止播放器,但这也无济于事.最后,我补充说prepareToPlay()- 遗憾的是,没有区别.
一个有趣或可能没有关系的有趣问题是,在大约15个音符的序列之后,音频停止一起工作.该应用程序继续正常,但没有任何声音.
这是代码的音频部分:
func playSound(_ soundID: Int) {
var soundName = ""
switch soundID {
case 0:
soundName = "beep1"
case 1:
soundName = "beep2"
case 2:
soundName = "beep3"
case 3:
soundName = "beep4"
case 4:
soundName = "swish3"
default:
soundName = "clank"
}
guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav") else { return }
do {
buttonSound.insert(try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue), at: playerIndex)
buttonSound[playerIndex].prepareToPlay()
buttonSound[playerIndex].delegate = self
if playerIndex < 10 { …Run Code Online (Sandbox Code Playgroud) 一旦我的SpriteKit游戏结束,我想回到我的UIKit MenuViewController.从我到目前为止所学到的,使用protocol/delegate是最好的(?)选项,但我无法让它工作.我知道协议可能会超出类声明GameViewController,看起来像:
protocol GameViewControllerDelegate {
var gameOver: Bool?
}
Run Code Online (Sandbox Code Playgroud)
但我需要帮助从GameSceneAND获取它解雇GameViewController.以下是应用程序的骨骼,如果有帮助的话.
MenuViewController
class MenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func goToGame(_ sender: UIButton) {
performSegue(withIdentifier: "toGameSegue", sender: sender.currentTitle)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVC = segue.destination as? GameViewController {
if let item = sender as? String {
destinationVC.numberOfPlayers = item
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
GameViewController
class GameViewController: UIViewController {
var numberOfPlayers: …Run Code Online (Sandbox Code Playgroud) 我有一个获取邮政编码并将其传递给方法的表单。该方法查找城市和州,并将信息作为元组返回。该方法还有一个完成处理程序,以便在找到城市和州之前不会保存其余的表单数据。
我将函数移至视图模型以保持秩序,但现在我很困惑。首先,必须在函数返回之前调用完成处理程序,尽管这似乎与我想要的完全相反。我想获取城市和州的值,然后我想通过处理程序保存它们。我困惑的后半部分是函数的调用。如果我分配一个变量,例如cityState从我的方法接收元组,则保存发生在我无法访问的闭包中!(请参阅下面的设置查看代码。)
我可以将所有内容移回正常工作的视图。但我试图了解 MVVM 应该如何工作。
设置视图模型
func getCityStateFromPostalCode(zip: String, completion: @escaping () -> ()) -> (String, String) {
let geocoder = CLGeocoder()
var city = ""
var state = ""
geocoder.geocodeAddressString(zip) { (placemarks, error) in
if let placemark = placemarks?[0] {
if placemark.postalCode == zip {
city = placemark.locality!
state = placemark.administrativeArea!
}
}
completion()
}
return (city, state)
}
Run Code Online (Sandbox Code Playgroud)
设置视图
let settingsVM = SettingsViewModel()
let cityState = settingsVM.getCityStateFromPostalCode(zip: companyZip) {
let newCompany = Company(context: self.moc) …Run Code Online (Sandbox Code Playgroud) 有人问我 Objective C 块是否更类似于闭包或回调。然而,回调的定义似乎与闭包几乎相同,至少在这个借用自http://swiftspace.org/callback-function-in-swift/的示例中:
\n\nfunc mainFunction(callback: () -> Void) {\n\n // some code\n callback() // call the callback function\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在《编程语言指南》(Swift 2.2)中很少提到回调,但有一个值得注意的例外,回调听起来像是一种闭包:
\n\n\n\n\n\xe2\x80\x9c当闭包\xe2\x80\x99s 类型已知时,例如委托的回调\n,您可以省略其参数类型、返回类型或两者。\xe2\ x80\x9d
\n
帮助?
\n我有一个 SKSpriteNode(称之为 gem),它使用 SKAction 序列在屏幕上移动。我想知道宝石与我的玩家精灵碰撞时的确切位置。
到目前为止我所知道的就是什么不起作用。我尝试在 didBeginContact 中使用firstBody.node?.position,但由于某种原因,这给了我gem首次加载时的位置,而不是碰撞发生的位置。我还尝试使用我的玩家的位置,因为宝石和玩家在碰撞时非常接近, - 结果还可以,但不如我想要的那么准确。
我不确定代码是否有帮助,但就在这里,以防万一......
动画宝石
let moveGem = SKAction.moveByX(-distance - 25, y: 0.0, duration: NSTimeInterval(speedOfGem * distance))
let removeGem = SKAction.removeFromParent()
moveAndRemove = SKAction.sequence([moveGem, removeGem])
Run Code Online (Sandbox Code Playgroud)
尝试获得职位
func didBeginContact(contact: SKPhysicsContact) {
let firstBody = contact.bodyA
let secondBody = contact.bodyB
if firstBody.categoryBitMask == PhysicsCategory.gem && secondBody.categoryBitMask == PhysicsCategory.player
{
print(firstBody.node!.position)
}
}
Run Code Online (Sandbox Code Playgroud) 下面的代码创造了一个"微光"效果,效果很好.(反射光在光滑表面上移动的外观.)它目前设置为永久重复,这很好,但是,我希望每个闪光之间有一个暂停.我可以延迟效果的开始,但我似乎无法弄清楚如何延迟每次运行.如果延迟时间是随机的,则奖励积分.
func startShimmering() {
let light = UIColor.white.cgColor
let alpha = UIColor.white.withAlphaComponent(0.0).cgColor
let gradient = CAGradientLayer()
gradient.colors = [alpha, light, alpha]
gradient.frame = CGRect(x: -self.bounds.size.width, y: 0, width: 3 * self.bounds.size.width, height: self.bounds.size.height)
gradient.startPoint = CGPoint(x: 1.0, y: 0.525)
gradient.endPoint = CGPoint(x: 0.0, y: 0.5)
gradient.locations = [0.1, 0.5, 0.9]
self.layer.mask = gradient
let animation = CABasicAnimation(keyPath: "locations")
animation.fromValue = [0.0, 0.1, 0.2]
animation.toValue = [0.8, 0.9, 1.0]
animation.duration = 1.5
animation.repeatCount = HUGE
gradient.add(animation, forKey: "shimmer")
}
Run Code Online (Sandbox Code Playgroud) 我已经使用编辑器创建了粒子效果,现在我想更改particleColor代码。我已设置particleColorSequence为 nil(否则我的颜色将来自编辑器中的色带而不是我的代码)并particleColorBlendFactor设置为 1.0。我particleColor在update方法中分配了一个随机颜色,希望它每次通过循环都会改变。它第一次选择随机颜色,但颜色永远不会改变。有人可以解释为什么吗?
全球的
let emitter = SKEmitterNode(fileNamed: "squares.sks")
let colors = [SKColor.red, SKColor.green, SKColor.blue]
Run Code Online (Sandbox Code Playgroud)
didMove(查看:)
emitter?.particleColorBlendFactor = 1.0
emitter?.particleColorSequence = nil
addChild(emitter!)
Run Code Online (Sandbox Code Playgroud)
更新(_ currentTime :)
let random = Int(arc4random_uniform(UInt32(self.colors.count)))
emitter?.particleColor = colors[random]
Run Code Online (Sandbox Code Playgroud) 我一直在使用 iPhone 11 预览版,直到对 CoreData 进行了一些更改 - 现在我遇到了持久性存储迁移错误。如果我切换到不同的预览配置文件,一切都会按预期进行。
我的问题是,如何重置 iPhone 11 配置文件?在模拟器中,我只需删除应用程序并重新开始。但我不知道如何用 Canvas 做到这一点。谢谢!
在使用MVC的Swift中,使用一种常见的向前发送数据的方法prepare(for:sender:).在该方法中,您将获得对目标VC的引用并访问其属性以发送数据.但这不是考虑耦合视图控制器吗?我希望答案不是一个意见问题,因为我真的很想了解seggu如何适应MVC.
我已将登录页面缩减为一个导航链接,该导航链接将列表视图作为其目的地。如下图所示,问题在于,我得到的标题不是左侧间隔良好的标题,而是右侧所示的巨大空间。两种视图都是相同的,但右侧的视图是页面设计时的预览。左图是登录屏幕后的页面预览。
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: CustomerView()) {
Text("login")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是列表视图的代码:
var body: some View {
NavigationView {
VStack {
SearchBarView(text: $searchText)
.padding(.top, 0)
List {
ForEach(customers.filter({searchText.isEmpty ? true : $0.name.localizedCaseInsensitiveContains(searchText)})) { customer in
NavigationLink(destination: CustomerDetailView(customer: customer)) {
CustomerRow(customer: customer)
}
.navigationBarTitle("Customers")
}
}
}
}
.navigationBarBackButtonHidden(true)
}
}
Run Code Online (Sandbox Code Playgroud)