Ios UIButton在新ViewController中使用代码时发送到实例的无法识别的选择器
我已经开始构建一个非常简单的应用程序,它有两个屏幕。第一个有两个按钮。在我的第一个视图控制器(ViewController.swift)中,一个按钮使用下面的代码播放随机声音,另一个按钮显示第二个屏幕 在第二个屏幕上还有两个按钮,一个用于播放另一个随机声音,另一个用于返回第一个屏幕 在第一个屏幕上播放随机声音效果很好 对于第二个屏幕,我创建了一个名为PageOneViewController.swift的全新ViewController,并确保在IB中正确分配了该类。该第二个视图控制器包含第二个页面代码的复写副本,但名称更改除外,以避免冲突和混淆。然而,任何试图在第二个页面上播放声音的尝试都会导致无法识别的选择器错误,我无法找出原因 错误消息如下所示:Ios UIButton在新ViewController中使用代码时发送到实例的无法识别的选择器,ios,iphone,swift,audio,uibutton,Ios,Iphone,Swift,Audio,Uibutton,我已经开始构建一个非常简单的应用程序,它有两个屏幕。第一个有两个按钮。在我的第一个视图控制器(ViewController.swift)中,一个按钮使用下面的代码播放随机声音,另一个按钮显示第二个屏幕 在第二个屏幕上还有两个按钮,一个用于播放另一个随机声音,另一个用于返回第一个屏幕 在第一个屏幕上播放随机声音效果很好 对于第二个屏幕,我创建了一个名为PageOneViewController.swift的全新ViewController,并确保在IB中正确分配了该类。该第二个视图控制器包含第二个
2016-10-17 18:04:57.749 NewApp[28750:2719569] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '- [NewApp.PageOneViewController buttonPressed2WithSender:]: unrecognized selector sent to instance 0x7fe79070b8a0'
它停在这条线上(我意识到这没有多大帮助):
我通过检查员手动连接按钮,并使用“内部触摸”作为触摸方法
我根本无法理解这一点。在旧的Objective-C时代,当我错误地命名了一个文件或捆绑包中丢失了一个声音文件时,我会遇到这个问题,但我已经一遍又一遍地检查了所有内容,无法确定发生了什么
ViewController.swift的代码:
import AVFoundation
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mainButton1: UIButton!
var arrayOfSounds = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44",
"45", "46", "47", "48", "49", "50", "51" , "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82"]
var audioPlayer : AVAudioPlayer?
func setupAudioPlayer(file: NSString, type: NSString){
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("Player not available")
}
}
@IBAction func buttonPressed(sender: AnyObject){
let range: UInt32 = UInt32(arrayOfSounds.count)
let number = Int(arc4random_uniform(range))
self.setupAudioPlayer(arrayOfSounds[number], type: "wav")
self.audioPlayer?.play()
}
}
import AVFoundation
import UIKit
class PageOneViewController: UIViewController {
@IBOutlet weak var mainButtonNew: UIButton!
var arrayOfSounds = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44",
"45", "46", "47", "48", "49", "50", "51" , "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82"]
var audioPlayer : AVAudioPlayer?
func setupAudioPlayer(file: NSString, type: NSString){
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("Player not available")
}
}
@IBAction func buttonPressedNew(sender: AnyObject){
let range: UInt32 = UInt32(arrayOfSounds.count)
let number = Int(arc4random_uniform(range))
self.setupAudioPlayer(arrayOfSounds[number], type: "wav")
self.audioPlayer?.play()
}
}
PageOneViewController.swift的代码:
import AVFoundation
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mainButton1: UIButton!
var arrayOfSounds = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44",
"45", "46", "47", "48", "49", "50", "51" , "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82"]
var audioPlayer : AVAudioPlayer?
func setupAudioPlayer(file: NSString, type: NSString){
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("Player not available")
}
}
@IBAction func buttonPressed(sender: AnyObject){
let range: UInt32 = UInt32(arrayOfSounds.count)
let number = Int(arc4random_uniform(range))
self.setupAudioPlayer(arrayOfSounds[number], type: "wav")
self.audioPlayer?.play()
}
}
import AVFoundation
import UIKit
class PageOneViewController: UIViewController {
@IBOutlet weak var mainButtonNew: UIButton!
var arrayOfSounds = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44",
"45", "46", "47", "48", "49", "50", "51" , "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82"]
var audioPlayer : AVAudioPlayer?
func setupAudioPlayer(file: NSString, type: NSString){
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("Player not available")
}
}
@IBAction func buttonPressedNew(sender: AnyObject){
let range: UInt32 = UInt32(arrayOfSounds.count)
let number = Int(arc4random_uniform(range))
self.setupAudioPlayer(arrayOfSounds[number], type: "wav")
self.audioPlayer?.play()
}
}
可能发生的情况是,在情节提要中,某些内容可能具有双重引用,例如引用两个IBoutlet或两个IBAction的按钮。您可能忘记从它们中删除引用。请在连接检查器中检查它们的连接,或按ctrl键单击其中一个。是否尝试在代码或断点中放置打印语句以查看具体在哪里崩溃?嗯,我仍然不知道到底是什么原因导致了这个问题,但我不顾一切地试图修复它,结果我从2.3升级到Swift 3,立即修复了这个问题。仔细检查interface builder中的所有链接。用完整准确的错误消息更新您的问题,并指出正确的行cau唱出错误。在播放音频文件之前,您需要执行player.prepareToPlay,并使用可选绑定,而不是强制展开代码中的变量。我已多次断开连接并重新连接,以确保一切正常。as re:断点。为了确保在两个ViewController中的每一行都设置了中断。什么奇怪的是,按下该按钮不会导致任何一个ViewController中的任何位置中断。它会直接导致异常。在第二个view controller中再次访问第一个音频播放器之前,可能需要关闭与第一个音频播放器的连接?