首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中使用Chromecast的Init

在Swift中使用Chromecast的Init
EN

Stack Overflow用户
提问于 2014-12-10 13:14:36
回答 1查看 2.2K关注 0票数 1

最近,我开始在iOS中使用Google,并试图让它与苹果的新编程语言Swift一起工作。我在https://github.com/googlecast/CastHelloText-ios使用了谷歌示例应用程序,问题是当我启动模拟器时,会收到一条错误消息,名为:"-GCKDeviceManager init:未识别的选择器发送到instance 0x7fd7a52d340“--我知道我忘记了一些东西,但我需要把它放在哪里?

为了让帮助我更容易,这是我的代码。

代码语言:javascript
运行
复制
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)
}

我的主要目标是在大屏幕上显示网页,这是我们通常在网页视图中看到的。抱歉密码太长了。如果你需要更多的信息来帮助我,请不要犹豫。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-10 13:47:21

我没有使用这个库,但是在您提供的链接中,它们正在像下面这样初始化GCKDeviceManager:

代码语言:javascript
运行
复制
self.deviceManager =
  [[GCKDeviceManager alloc] initWithDevice:self.selectedDevice
                         clientPackageName:[info objectForKey:@"CFBundleIdentifier"]];

这应转化为这一迅速的代码:

代码语言:javascript
运行
复制
self.deviceManager = GCKDeviceManager(self.selectedDevice, clientPackageName:info["CFBundleIdentifier"])

这意味着您的代码看起来是无效的(或者至少是GCKDeviceManager init):

代码语言:javascript
运行
复制
var deviceScanner = GCKDeviceScanner()
var deviceManager = GCKDeviceManager()
var mediaInformation = GCKMediaInformation()
var selectedDevice = GCKDevice()

您应该将它改为如下:

代码语言:javascript
运行
复制
var deviceScanner : GCKDeviceScanner!
var deviceManager : GCKDeviceManager!
var mediaInformation : GCKMediaInformation!
var selectedDevice : GCKDevice!

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27401967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档