使用Swift中的Chromecast进行初始化

我最近开始在iOS中使用Google Cast API,我正试图让它与Apple新的编程语言Swift一起使用。 我在https://github.com/googlecast/CastHelloText-ios上用作参考Google示例应用程序,问题是当我启动模拟器时收到一条错误消息: “ – [GCKDeviceManager init]:无法识别的选择器发送到实例0x7fcd7a52d340“我知道我忘记了什么,但我需要把它放在什么地方?

为了方便我帮助,这是我的代码。

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) } 

我的主要目标是在大屏幕上显示网页,我们通常在网页浏览中看到的内容。 对不起长代码。 如果您需要更多信息来帮助我,请不要犹豫。 谢谢!

我没有使用过这个库,但在你提供的链接中,他们正在初始化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! 

您需要确保在访问它们之前分配这些值,否则它将崩溃。 否则,您可以将类型切换为选项。