我制作了一个watchOS连接应用程序,它可以工作。现在我正在尝试为iPhone和Watch制作一个专门的连接类。对于iPhone连接类,我有这个(我还有其他传输数据的方法,但问题在这里):
import UIKit
import WatchConnectivity
class iPhoneConnectivity: UIViewController, WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
}
func sessionDidBecomeInactive(_ session: WCSession) {
}
func sessionDidDeactivate(_ session: WCSession) {
}
var session : WCSession!;
func getPrepared() {
if (WCSession.isSupported()) {
// check if the watch connectivity is suported on device
self.session = WCSession.default;
self.session.delegate = self;
self.session.activate();
} else {
print("Session is not supported")
}
}
}
问题是当我尝试在ViewController中调用此方法时
connect.getPrepared();
应用程序意外退出。
我有一个全局变量
var connect: iPhoneConnectivity!;
是因为我没有初始化连接变量吗?如果那是问题,我应该如何初始化它?
在最初的应用程序中,我在ViewController的方法中使用了getPrepared()方法的代码didLoad()
答案 0 :(得分:1)
问题是connect
是一个隐式解包的可选项,您可以在其上调用函数而不实际初始化它。隐式解包的选项仍然是选项,因此如果你不给它们一个值,它们默认是零。因此,当您尝试访问它们而不首先给它们一个非零值时,您将获得运行时异常。
将connect
定义为单身,而不是全局变量。
class iPhoneConnectivity: WCSessionDelegate {
static let sharedInstance = iPhoneConnectivity()
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
func sessionDidBecomeInactive(_ session: WCSession) {}
func sessionDidDeactivate(_ session: WCSession) {}
var session : WCSession!;
func getPrepared() {
if (WCSession.isSupported()) {
// check if the watch connectivity is suported on device
self.session = WCSession.default;
self.session.delegate = self;
self.session.activate();
} else {
print("Session is not supported")
}
}
}
您可以使用iPhoneConnectivity.sharedInstance
访问它,然后使用getPrepared()
致电iPhoneConnectivity.sharedInstance.getPrepared()
。