Swift:从NSItemProvider内部更改UITextField值

时间:2018-02-01 05:03:04

标签: ios swift swift3

我一整天都在和这个人争斗,因为你可以看到我是Swift的新手。

我试图在iOS动作扩展中更新UITextField。正确的值记录在下面,在loadItem()之外,可以设置正确的值。

插座中的弱变量?某种封闭的东西?函数异步触发,一旦完成,我不允许以这种方式更新UI吗?

提前谢谢!

class ActionViewController: UIViewController {

    //outlets
    @IBOutlet weak var bookmarkTitle: UITextField!

    //vars
    var pageTitle = ""



    override func viewDidLoad() {
        super.viewDidLoad()


         if let inputItem = extensionContext!.inputItems.first as? NSExtensionItem {
             if let itemProvider = inputItem.attachments?.first as? NSItemProvider {
                 itemProvider.loadItem(forTypeIdentifier: kUTTypePropertyList as String) { [unowned self] (dict, error) in
                    // do stuff!
                    let itemDictionary = dict as! NSDictionary
                    let javaScriptValues = itemDictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! NSDictionary
                    print(javaScriptValues)
                    //this works, gets correct data. how to assign to IBOutlet?
                    self.pageTitle = javaScriptValues["title"] as! String
                    NSLog("Title From JS Preprocessor: " + self.pageTitle)

                    /*===================================*/
                    //Reference to property 'bookmarkTitle' in closure requires explicit 'self.' to make capture semantics explicit
                        //bookmarkTitle.text = self.pageTitle

                    //when the line below is used, the action extension fails to even open
                    self.bookmarkTitle.text = self.pageTitle
                    /*===================================*/

                }
             }
         }
    }

}

1 个答案:

答案 0 :(得分:1)

尝试更改主队列中的文本字段文本,如下所示:

DispatchQueue.main.async { 
// work that impacts the user interface 
self.bookmarkTitle.text = self.pageTitle 
}