如何在Swift中正确使用#selector?

时间:2018-03-19 21:09:35

标签: ios swift

我正在使用WKWebView.reload添加iOS应用内网页浏览器的重新加载按钮 我尝试了两个选项,这两个选项对我来说同样适用,但我想知道与#selector一起使用的技术正确选项是什么。是#selector(class.method)还是#selector (object.method)

这是第一个:

let webView = WKWebView()
view = webView
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(WKWebView.reload))

这里是第二个:

let webView = WKWebView()
view = webView
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(webView)) 

这是完整的代码

import UIKit
import WebKit

class ViewController: UIViewController {

    let webView = WKWebView()

    override func loadView() {
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(WKWebView.reload))
    }
}

3 个答案:

答案 0 :(得分:0)

您的let webView = WKWebView()正在创建您的新实例..它不会独立于您的#selector

尝试一下:

func reloadWebView() {
    webView.reload()
}

你的电话:

navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(MyViewController.reloadWebView))

答案 1 :(得分:0)

函数reload未声明为 @objc ,因此,它无法在swift中作为选择器工作。您可能想在ViewController中创建一个函数,并从那里调用重载函数。

@objc func reloadWebView() {
    webView.reload()
}

,您的选择器将如下所示 #selector(reloadWebView)

来源:https://developer.apple.com/documentation/webkit/wkwebview/1414969-reload

答案 2 :(得分:0)

目前,我的建议是使用#selector(target.method)

当您将self作为target传递给#selector(self.method)时,将webView传递给target,然后传递#selector(webView.method)

#selector只是一个编码的ObjC方法名称(不包括类名),因此#selector(ClassName.method)#selector(object.method)都应该有效。但是您可以期望使用#selector(target.method)进行更好的编译时诊断。