【问题标题】:How to send an object as argument when a UIButton is tapped?点击 UIButton 时如何发送对象作为参数?
【发布时间】:2011-03-22 20:12:14
【问题描述】:

我的 UIViewController 中有以下代码 -

[flipButton addTarget:self.navigationController.delegate action:@selector(changeModeAction:) forControlEvents:UIControlEventTouchUpInside];

如您所见,它在其导航控制器委托中调用了一个方法。如何正确地将对象传递给此方法?

【问题讨论】:

    标签: iphone cocoa-touch ios4 uibutton


    【解决方案1】:

    您可以使用图层属性。在图层字典中添加要传递的对象作为值。

    [[btn layer] setValue:yourObj forKey:@"yourKey"];
    

    这个yourObj 可以通过按钮操作函数访问:

    -(void)btnClicked:(id)sender
    {
        yourObj = [[sender layer] valueForKey:@"yourKey"];
    }
    

    使用此方法,您只需在字典中添加具有不同键的新对象即可将多个值传递给按钮功能。

    【讨论】:

      【解决方案2】:

      或者你可以使用 objc_setAssociatedObject 和 objc_getAssociatedObject

      【讨论】:

      • 这个记录在案的或私有的 API 是否一定会被 Apple 拒绝?
      • 查看文档。试试“Objective-C 运行时参考”。
      • 您能否通过示例代码或任何链接进行解释,这将非常有帮助。谢谢
      【解决方案3】:

      changeModeAction: 被调用时,flipButton 应该将自己作为发送者传递。如果您需要传递其他参数,您可以create a category 为翻转按钮的类型存储其他信息,或者您可以设置一个导航控制器可以访问的字典,例如

      if(sender == flipButton)
       id obj = [someDictionary objectForKey:@"flipButtonKey"];
      

      【讨论】:

        【解决方案4】:

        扩展 + Swift 3.0

        extension NSObject {
        
        fileprivate struct ObjectTagKeys {
            static var ObjectTag = "ObjectTag"
        }
        
        func setObjectTag(_ tag:Any!) {
            objc_setAssociatedObject(self, &ObjectTagKeys.ObjectTag, tag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        
        func getObjectTag() -> Any
        {
            return objc_getAssociatedObject(self, &ObjectTagKeys.ObjectTag)
        }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-10
          • 1970-01-01
          • 2017-10-01
          • 2017-02-20
          • 2020-04-25
          • 1970-01-01
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多