UI元素在共享扩展的Swift中为nil。

7 浏览
0 Comments

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

}

0