最近,我开始在iOS中使用Google,并试图让它与苹果的新编程语言Swift一起工作。我在https://github.com/googlecast/CastHelloText-ios使用了谷歌示例应用程序,问题是当我启动模拟器时,会收到一条错误消息,名为:"-GCKDeviceManager init:未识别的选择器发送到instance 0x7fd7a52d340“--我知道我忘记了一些东西,但我需要把它放在哪里?
为了让帮助我更容易,这是我的代码。
class SettingsController: UIViewController, UITextFieldDelegate, GCKDeviceScannerListener, GCKDeviceManagerDelegate, GCKMediaControlChannelDelegate {
var deviceScanner : GCKDeviceScanner!
var deviceManager : GCKDeviceManager!
var mediaInformation : GCKMediaInformation!
var applicationMetadata : GCKApplicationMetadata!
var mediaControlChannel : GCKMediaControlChannelDelegate!
var selectedDevice : GCKDevice!
var textChannelVar : textChannel!
var chromecastButton : UIButton!
var btnImage : UIImage!
var btnImageSelected : UIImage!
var kReceiverAppID = "642B7ADB"
func chooseDevice() {
if self.selectedDevice == nil {
let alertController = UIAlertController(title: "Choose an device..", message: "Tap on a prefered device", preferredStyle: .ActionSheet)
for selectedDevice in self.deviceScanner.devices {
alertController.addAction(UIAlertAction(title: selectedDevice.friendlyName, style: .Default, handler: { alertAction in
self.connectToDevice()
}))
}
alertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { AlertAction in
alertController.dismissViewControllerAnimated(true, completion: nil)
}))
self.presentViewController(alertController, animated: true, completion: { () -> Void in
if self.selectedDevice != nil {
self.connectToDevice()
}
})
}
else {
self.updateButtonStates()
self.mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle)
var alertController = UIAlertController(title: "Casting to: \(self.selectedDevice.friendlyName)", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
alertController.addAction(UIAlertAction(title: "Disconnect", style: .Default, handler: { alertAction in
println("de waarde van self.mediaInformation is : \(self.mediaInformation)")
if self.mediaInformation != nil {
println("else uiactionsheet")
(self.mediaInformation != nil ? 1 : 0)
alertController.dismissViewControllerAnimated(true, completion: nil)
}
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { alertAction in
if self.mediaInformation != nil {
println("else uiactionsheet")
(self.mediaInformation != nil ? 2 : 1)
alertController.dismissViewControllerAnimated(true, completion: nil)
}
}))
self.presentViewController(alertController, animated: true, completion: nil)
}
}
func isConnected() -> Bool {
return self.deviceManager.isConnected
}
func connectToDevice() {
if self.selectedDevice == nil {
self.deviceManager = GCKDeviceManager(device: self.selectedDevice, clientPackageName:"CFBundleIdentifier")
self.deviceManager.delegate = self
self.deviceManager.connect()
return
}
}
func deviceDisconnected() {
self.deviceManager = nil
self.selectedDevice = nil
self.textChannelVar = nil
NSLog("Device disconneted: \(self.selectedDevice.friendlyName)")
}
func updateButtonStates() {
if (self.deviceScanner.devices.count == 0) {
chromecastButton.setImage(btnImage, forState: .Normal)
chromecastButton.hidden = true
}
else {
chromecastButton.setImage(btnImage, forState: .Normal)
chromecastButton.hidden = false
if (self.deviceManager != nil) {
if self.deviceManager.isConnected {
chromecastButton.setImage(btnImageSelected, forState: .Normal)
}
}
else {
chromecastButton.setImage(btnImageSelected, forState: .Normal)
}
}
}
func deviceDidComeOnline(device: GCKDevice!) {
NSLog("device found! \(device.friendlyName)")
self.updateButtonStates()
}
func deviceDidGoOffline(device: GCKDevice!) {
self.updateButtonStates()
}
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
if self.selectedDevice == nil {
if buttonIndex < self.deviceScanner.devices.count {
self.selectedDevice = self.deviceScanner.devices[buttonIndex] as GCKDevice
NSLog("Selecting device: \(self.selectedDevice.friendlyName)")
self.connectToDevice()
}
}
else {
if buttonIndex == 1 {
NSLog("Disconnecting device: \(self.selectedDevice.friendlyName)")
self.deviceManager.leaveApplication()
self.deviceManager.disconnect()
self.deviceDisconnected()
self.updateButtonStates()
}
else if buttonIndex == 0 {
}
}
}
func deviceManagerDidConnect(deviceManager: GCKDeviceManager!) {
NSLog("Connected!")
self.updateButtonStates()
self.deviceManager.launchApplication(kReceiverAppID)
}
func deviceManager(deviceManager: GCKDeviceManager!, didConnectToCastApplication applicationMetadata: GCKApplicationMetadata!, sessionID: String!, launchedApplication: Bool) {
NSLog("application has launched \(launchedApplication)")
}
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectToApplicationWithError error: NSError!) {
self.showError(error)
self.deviceDisconnected()
self.updateButtonStates()
}
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectWithError error: NSError!) {
self.showError(error)
self.deviceDisconnected()
self.updateButtonStates()
}
func deviceManager(deviceManager: GCKDeviceManager!, didDisconnectWithError error: NSError!) {
NSLog("Received notification that device disconnected")
if error != nil {
self.showError(error)
}
self.deviceDisconnected()
self.updateButtonStates()
}
func showError(error: NSError) {
var alert = UIAlertController(title: "Something went wrong", message: error.description, preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
kReceiverAppID = kGCKMediaDefaultReceiverApplicationID
btnImage = UIImage(named: "icon-cast-identified.png")
btnImageSelected = UIImage(named: "icon-cast-connected")
self.chromecastButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
self.chromecastButton.addTarget(self, action: "chooseDevice", forControlEvents: .TouchDown)
self.chromecastButton.frame = CGRectMake(0, 0, 39, 34)
self.chromecastButton.setImage(nil, forState: .Normal)
self.chromecastButton.hidden = true
self.deviceScanner = GCKDeviceScanner()
self.deviceScanner.addListener(self)
self.deviceScanner.startScan()
self.view.addSubview(self.chromecastButton)
}
我的主要目标是在大屏幕上显示网页,这是我们通常在网页视图中看到的。抱歉密码太长了。如果你需要更多的信息来帮助我,请不要犹豫。谢谢!
发布于 2014-12-10 13:47:21
我没有使用这个库,但是在您提供的链接中,它们正在像下面这样初始化GCKDeviceManager:
self.deviceManager =
[[GCKDeviceManager alloc] initWithDevice:self.selectedDevice
clientPackageName:[info objectForKey:@"CFBundleIdentifier"]];
这应转化为这一迅速的代码:
self.deviceManager = GCKDeviceManager(self.selectedDevice, clientPackageName:info["CFBundleIdentifier"])
这意味着您的代码看起来是无效的(或者至少是GCKDeviceManager init):
var deviceScanner = GCKDeviceScanner()
var deviceManager = GCKDeviceManager()
var mediaInformation = GCKMediaInformation()
var selectedDevice = GCKDevice()
您应该将它改为如下:
var deviceScanner : GCKDeviceScanner!
var deviceManager : GCKDeviceManager!
var mediaInformation : GCKMediaInformation!
var selectedDevice : GCKDevice!
在访问这些值之前,需要确保这些值被分配给它们,否则就会崩溃。否则,您可以切换类型为选项。
https://stackoverflow.com/questions/27401967
复制相似问题