我正在尝试使用 Collection View 在 Swift 中创建一个简单的音板,每个按钮代表一个可以播放的声音。结构如下(我知道,这可能不是最聪明的方法,但在我添加更多声音之前它工作得更早):我有一个带有 SoundFiles 类的 SoundFiles.swift,我声明了它
static let shared = SoundFiles()
它包含两个数组
let soundfiles: [String] = ["example_bla"]
let soundnames: [String] = ["example bla"]
还有
var translation: [String: String] = [:]
var currentSoundfiles: [String] = []
“翻译”字典应该在文件名和屏幕上显示的内容之间产生差异,即它匹配数组“soundfiles”和“soundnames”。 “currentSoundfiles”数组负责在应用过滤器(搜索功能)后显示的声音文件。 在我的标签栏 Controller 中,我有一个包含
的 View Controllervar soundPlayers: [Sound?] = []
override func viewDidLoad() {
super.viewDidLoad()
setUpView()
setupSwiftySound()
setupDismissKeyboard()
SoundFiles.shared.currentSoundfiles = SoundFiles.shared.soundfiles
SoundFiles.shared.findTranslation()
fillDropDowns()
fillSounds()
}
override func viewDidAppear(_ animated: Bool) {
refreshCollectionView()
}
在哪里
func fillSounds(){
soundPlayers.removeAll()
for (index, _) in SoundFiles.shared.currentSoundfiles.enumerated(){
if let playingURL = Bundle.main.url(forResource: SoundFiles.shared.currentSoundfiles[index], withExtension: "wav"){
soundPlayers.append(Sound(url: playingURL))
soundPlayers[index]?.volume = SoundFiles.shared.volume
}
}
}
是唯一相关的功能。只要我包含 49 个或更少的声音文件,一切都很好。包括50个或更多的声音文件,多次出现以下错误/警告:
SwiftySound initialization error: Error Domain=NSOSStatusErrorDomain Code=-42 "(null)"
奇怪的是,我仍然可以毫无问题地运行前 49 个声音文件(点击其他按钮没有任何作用),但任何其他操作都会导致应用程序崩溃,例如尝试更改为应用程序的不同 View Controller 或通过单击按钮旁边的“+”(使用下拉菜单实现)来检索声音文件的其他信息。尝试转到第二个 View Controller 选项卡时的崩溃错误如下所示:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle (loaded)' with name 'fGY-5H-E9k-view-obO-1i-lrO' and directory 'SbOne.storyboardc'' *** First throw call stack: (0x185e48ec4 0x185019a50 0x185d4f594 0x1b2c8fea8 0x1b2a208e0 0x1b2a2128c 0x1b2a21554 0x1b298dea8 0x1b298e1b0 0x1b298f140 0x1b2990440 0x1b2972630 0x1b349177c 0x18a444b7c 0x18a449b34 0x18a3a8598 0x18a3d6ec8 0x18a3d7d30 0x185dd87cc 0x185dd3460 0x185dd3a00 0x185dd31f0 0x18804c584 0x1b2fe8c00 0x102474838 0x185892bb4) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
XCode 将我带到 AppDelegate.swift 显示
Thread 1: signal SIGABRT
问题与包含哪些声音文件无关,只取决于数量。有人知道这里发生了什么吗?
最佳答案
正如@DavidPasztor 指出的那样,问题是内存问题,因为我一次打开了太多声音文件。将 playersPerSound 属性减少到 1 确实解决了问题,但它当然会在某个时候再次发生。我现在如何为我解决问题如下:
我为每个声音保留了 5 个播放器,以便能够在完成之前多次播放声音(这对我的其他 Storyboard/ View Controller 很重要,用户应该从第一个 Storyboard/中选择较短的声音列表/查看 Controller 以进行快速选择)。在第一个 Storyboard/View Controller 中,我去掉了 fillSounds 函数,而是在应该播放声音时使用以下代码:
@objc func playSound(sender: UIButton){
if soundPlayers.count >= 20 {
soundPlayers.removeLast(10)
}
if let playingURL = Bundle.main.url(forResource: SoundFiles.shared.currentSoundfiles[sender.tag], withExtension: "wav"){
soundPlayers.append(Sound(url: playingURL))
soundPlayers[soundPlayers.count-1]?.volume = SoundFiles.shared.volume
soundPlayers[soundPlayers.count-1]?.play()
}
}
此代码片段现在不使用每个声音的 5 个播放器,而是在再次播放相同声音时添加一个新播放器,并在大小达到 20 时删除前 10 个播放器。其他 Storyboards/View Controller 不受板上声音数量不能超过 20(或任何其他合理数量)的限制。到目前为止,我还没有遇到任何应用程序的问题。
关于ios - Swift:如果加载超过 49 个声音文件,SwiftySound 初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54796613/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更