UI元素在共享扩展的Swift中为nil。
UI元素在共享扩展的Swift中为nil。
我一直在为我的iOS应用开发一个分享扩展,使用了自定义的视图控制器。这个自定义视图控制器包含一个ImageView、一个标签和一个文本框。我想要从用户试图与我的应用分享的网页中获取URL,并将其设置为标签的文本。但是当我尝试访问标签时,它是nil。我已经在不同的生命周期方法中尝试了这个操作,如`viewDidLoad()`、`viewWillAppear()`,最后我使用了`viewDidAppear()`,但结果都是一样的。这些元素在Storyboard中与ViewController正确连接。以下是我的ViewController代码:
import UIKit
import Social
class ShareViewController: UIViewController {
@IBOutlet var ScreenCapture: UIImageView!
@IBOutlet var articleTitle: UITextField!
@IBOutlet var urlLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
if let attachments = item.attachments {
for attachment: NSItemProvider in attachments {
if attachment.hasItemConformingToTypeIdentifier("public.url") {
attachment.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) in
if let shareURL = url as? URL {
self.urlLabel.text = shareURL.absoluteString
}
})
}
}
}
}
}
@IBAction func cancelShare(_ sender: Any) {
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
@IBAction func doneShare(_ sender: Any) {
//TODO: Insert into CoreData
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
}
我在`self.urlLabel.text = shareURL.absoluteString`这一行设置了断点,以下是调试器信息:
![DebuggerInfo](https://i.stack.imgur.com/plMWF.png)
编辑:最终我解决了我的问题,我必须调用`loadViewIfNeeded()`:
override func loadViewIfNeeded() {
super.loadViewIfNeeded()
let image = makeScreenShoot(withView: view)
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
if let attachments = item.attachments {
for attachment: NSItemProvider in attachments {
if attachment.hasItemConformingToTypeIdentifier("public.url") {
attachment.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) in
if let shareURL = url as? URL {
self.urlLabel.text = shareURL.absoluteString
}
})
}
}
}
}
ScreenCapture.image = image
}