UIBarButtonItem - #selector的参数不能引用本地函数 - Swift 3

5

我在创建一个调用handleSearch函数的导航按钮时遇到了问题。我收到了一条消息Argument of '#selector' cannot refer to local function。希望能得到帮助!

override func viewDidLoad() {
   // various code

   func setupNavBarButtons() {
       let searchImage = UIImage(named:"search_icon")
       let searchBarButtonItem = UIBarButtonItem(image: searchImage, style: .plain, target: self, action: #selector(handleSearch(sender:)))
        navigationItem.rightBarButtonItems = [searchBarButtonItem]

    }

    func handleSearch(sender: UIBarButtonItem) {
        print(123)
    }
}

提示:handleSearch是否在另一个函数内部? - rmaddy
它在viewDidLoad中。 - Luke
我根据你的评论更新了你问题的代码,以使问题更加清晰。 - rmaddy
1个回答

14

#selector 只能引用顶级函数,不能引用局部函数(即在另一个函数内部的函数)。

只需将 handleSearch 移出 viewDidLoad,您的问题就会得到解决。


如果我不想将 #selector 函数移出,那么在我的情况下将该函数移动到顶层需要太多的工作。 - Ahmed Eid
1
@aeid #selector 只能用于顶层函数。这是确定的事实。如果您不想移动该函数,那么您不能使用选择器。 - rmaddy
那么如果选择器必须在函数内部,就没有办法使用需要选择器的控件吗?:( - Glenn Posadas
@Glenn 不行。在典型的目标/选择器用例中传递的选择器必须是类中的顶层函数。 - rmaddy
1
@rmaddy 有没有其他可以代替 #selector 的东西可用? - Abdullah Ajmal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接