如何在 addTarget #Selector 中将静态参数传递给 UIRefreshControl() 的本地函数

Posted

技术标签:

【中文标题】如何在 addTarget #Selector 中将静态参数传递给 UIRefreshControl() 的本地函数【英文标题】:how to pass static parameters to a local function for UIRefreshControl() in addTarget #Selector 【发布时间】:2019-09-10 10:18:08 【问题描述】:

我在表格视图中添加了 refreshcontrol,在下拉时,它应该调用以字典为参数的本地方法。但是我搜索了很多,但无法在 uirefreshcontrol 的 addTarget 中将字典作为参数发送。请帮助我以字典作为参数调用本地方法。

我尝试过的是使用 objc 并且也没有选择器,但它没有用。

let defaultParam = ["buyer_id":UserDefaults.standard.string(forKey: "UserName")!,"transaction_type":""]
    refreshControl.addTarget(self, action: "loadStatement:", for: .valueChanged)

func loadStatement(parameter : Dictionary<String, Any>) 

如果我可以使用我希望发送的参数调用此本地方法,那将非常有帮助。

【问题讨论】:

***.com/questions/24814646/… ?它很旧,但由于它使用相同的addTarget(),因此逻辑保持不变。也和 Objective-C 一样。 如果逻辑相同,请解释,因为我无法理解。 【参考方案1】:

您要传递的dictionary 不包含任何特定于refreshControl 的内容。

您可以在loadStatement() 方法本身中创建defaultParams dictionary,而不是尝试在refreshControl 事件中传递它,即

 func loadStatement() 
    var defaultParam = [String:Any]()
    defaultParam["buyer_id"] = UserDefaults.standard.string(forKey: "UserName")
    defaultParam["transaction_type"] = ""
    //rest of the code here...
 

或者如果有一些依赖,你可以使用实例属性来代替。

编辑:

尝试使用默认参数值来实现该功能,

override func viewDidLoad() 
    super.viewDidLoad()
    refreshControl.addTarget(self, action: #selector(loadStatement(parameter:)), for: .valueChanged)


func method1() 
    var params = [String:Any]()
    //....
    loadStatement(parameter: params) //called with custom params here....


@objc func loadStatement(parameter: [String:Any] = ["buyer_id":UserDefaults.standard.string(forKey: "UserName")!,"transaction_type":""]) 
    print(parameter)
    //rest of the code here...
 

【讨论】:

实际上该方法会在不同的地方以不同的参数调用。这就是我挣扎的原因。 然后尝试使用实例属性。你不能用 refreshControl 传递它。 请举例说明,听不懂。 您只需为 refreshControl 添加目标一次。为什么字典需要不同的值。请澄清上下文。 method1()有什么用?【参考方案2】:

我为自己找到了另一种解决方案。只需编写另一种不带参数的方法并调用它。该空方法应该使用所需的参数调用。现在很好。感谢你的关心。

    refreshControl.addTarget(self, action: #selector(loadDatas), for: .valueChanged)

    @objc func loadDatas()
          loadStatement(parameter: ["buyer_id":UserDefaults.standard.string(forKey: "UserName")!,"transaction_type":""])
     

【讨论】:

以上是关于如何在 addTarget #Selector 中将静态参数传递给 UIRefreshControl() 的本地函数的主要内容,如果未能解决你的问题,请参考以下文章

UIControl (addTarget:action:forControlEvents:) @selector 参数

行“addTarget ...”上无法识别的选择器,如何解决?

如何在UITextField中仅为UIControlEvent.allEditingEvents覆盖addTarget?

Swift: Swift中Selector的变化

UIbutton frame 和 addtarget 不同

UITapGestureRecognizer 和 addTarget 的区别