使用最新版本的XCode和Swift。
我用webview创建了一个简单的应用程序。控制器内的IBOutlet正确连接。在viewDidLoad()中加载请求时,一切似乎都没问题。
但是,我想将设备令牌传递给webview。我在AppDelegate中使用以下函数:
var vc = ViewController()
...
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
var token = NSString(format: "%@", deviceToken)
token = token.stringByReplacingOccurrencesOfString( "<", withString: "")
token = token.stringByReplacingOccurrencesOfString( ">", withString: "")
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
vc.deviceToken = token as String;
vc.loadSomeUrl()
}
loadSomeUrl()函数如下所示:
func loadSomeUrl() {
let url = NSURL (string: "http://google.de" );
let requestObj = NSURLRequest(URL: url!);
webview.loadRequest(requestObj);
}
运行应用程序时,我收到以下消息:
fatal error: unexpectedly found nil while unwrapping an Optional value
我完全不知道问题是什么。我发现webview突然变为零,尽管之前调用了viewDidLoad()。我添加了一个print(webview)到viewDidLoad(),它正常工作。将print(webview)添加到loadSomeUrl()时;上述致命错误也会被触发。
为了进一步调查,我将以下代码段添加到插座中。
@IBOutlet var webview: UIWebView!{
didSet {
print("webview set to %@", webview);
}
}
外面很好。输出后会出现上述错误。
webview set to %@ <UIWebView: 0x145d18910; frame = (0 0; 600 556); autoresize = RM+BM; layer = <CALayer: 0x145d20f20>>
fatal error: unexpectedly found nil while unwrapping an Optional value
有人知道问题是什么吗?也许我以错误的方式解决了整个问题。
答案 0 :(得分:1)
我认为在AppDelegate中您正在创建VC的新实例,并且webView是零。
var vc = ViewController()
所以你需要从故事板加载AppDelegate中的ViewController。
另一种方法是在收到令牌时向viewController发送通知。
在对象中:
[[NSNotificationCenter defaultCenter] postNotificationName:@"tokenNotification" object:token userInfo:userInfo];
夫特:
//AppDElegate
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{
var token = NSString(format: "%@", deviceToken)
token = token.stringByReplacingOccurrencesOfString( "<", withString: "")
token = token.stringByReplacingOccurrencesOfString( ">", withString: "")
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
NSNotificationCenter.defaultCenter().postNotificationName("tokenNotification", object: token);
}
// VC
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.loadSomeUrl), name: "tokenNotification", object: nil)
}
func loadSomeUrl(notification:NSNotification) {
let url = NSURL (string: "http://google.de" );
let requestObj = NSURLRequest(URL: url!);
webview.loadRequest(requestObj);
}