objc_getAssociatedObject()总是为零

时间:2015-02-20 17:47:22

标签: ios xcode uitableview swift

我有一个很大的tableView,我想在用户选择一个单元格后在tableView中添加d​​atePickers。

我使用objc_setAssociatedObject()和objc_getAssociatedObject()而不是使用这么多变量。

我的问题是:objc_getAssociatedObject()在cellForRowAtIndexPath中总是为n ...

这是我的代码中的一个示例:(假设用户选择了一个行= 0的单元格)

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    ...

    if indexPath.row == 1 {
        var keypath = "datePicker\(indexPath.section)\(indexPath.row)"
        println(objc_getAssociatedObject(self, &keypath))
        ...
    }

}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let ip = NSIndexPath(forRow: indexPath.row+1, inSection: indexPath.section)
    var keypath = "datePicker\(indexPath.section)\(indexPath.row+1)"

    objc_setAssociatedObject(self, &keypath, UIDatePicker.alloc(), objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
    insertRowsAtIndexPaths([ip], withRowAnimation: .Top)
}

4 个答案:

答案 0 :(得分:4)

您有两个本地keyPath变量,因此它们的地址(&keypath)自然不一样。正是这个地址被用作关键。

keyPath提升为文件级全局。现在你的代码应该可以工作了。

答案 1 :(得分:0)

我认为没有理由在这里使用objc_set/getAssociatedObject - Dictionary<String, UIDatePicker>应该做你需要的事情,而且肯定不会出错:

var datePickers: [String: UIDatePicker] = [:]

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    ...

    if indexPath.row == 1 {
        var keypath = "datePicker\(indexPath.row)"
        println(datePickers[keypath])
        ...
    }

}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let ip = NSIndexPath(forRow: indexPath.row+1, inSection: indexPath.section)
    var keypath = "datePicker\(indexPath.row+1)"

    datePickers[keyPath] = UIDatePicker()
    insertRowsAtIndexPaths([ip], withRowAnimation: .Top)
}

答案 2 :(得分:0)

我不知道它为什么不起作用,所以我现在正在更改我的代码,为我的tableView添加NSIndexPath(s)属性,并使用它们来跟踪可用的datePickers。

这肯定会解决我的问题。

答案 3 :(得分:0)

您的问题是关联密钥不一致。

这是一个详细说明如何构建一个整齐地包装并保持一致的关联键的示例。在iOS和&amp; OSX。 (静态字符串常量适用于iOS 但不适用于OSX

class MyClass : NSObject
{
    static let AssociationKey = UnsafePointer<Int>(bitPattern: 0)

    var attactedProperty: String?
    {
        get
        {
            return objc_getAssociatedObject(self, MyClass.AssociationKey) as? String
        }
        set
        {
            objc_setAssociatedObject(self, MyClass.AssociationKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

由于关联使用原始指针值;如果你在哪里使用static let AssociationKey = "fred"那么StringUnsafePointer<>的隐式包装会在传递给objc_getAssociatedObject时创建一个新的包装器实例。这个新实例将具有不同的指针值。