-1
NSString *firstName2 = @"foo";
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:firstName2, @"storeData", nil];

NSString * __strong *storeData = NULL;
storeData = &[dict objectForKey:@"storeData"];

*storeData = @"bar";

设置时storeData,我希望它firstName也能改变。我得到一个构建错误:"address expression must be an lvalue or a function designator"

我该怎么做?

编辑 在大图中,我正在尝试创建 UITextField 的子类,它获取对变量的引用并将其设置在 textField:DidEndEditing 方法中。

4

2 回答 2

1

该代码没有意义,C(Objective-C)也不能那样工作。

方法的返回值通常在寄存器中,因此没有地址。即使是这样,获取指向对象内部的指针以便您可以直接使用它们也是一种非常糟糕的设计模式。

于 2013-06-12T16:10:45.503 回答
0

我认为你不需要子类UITextField来实现你的目标。无论如何,您尝试实施的解决方案存在哲学缺陷,因为它破坏了封装。

怎么解决?您的文本字段几乎肯定归视图控制器子类所有。只要该对象符合UITextFieldDelegate协议并且每个文本字段都将控制器对象作为其委托,那么您应该很好。剩下的唯一任务就是将文本字段映射到控制器或其他对象上的属性。

让我们假设您的控制器拥有某个数据对象的实例,您正在尝试使用控制器的 UI 设置其属性。我们称之为MyDataObject

@interface MyDataObject : NSObject

@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;

@end

@implementation MyDataObject
@end

要将文本字段映射到此对象的属性,您可以执行以下操作:

- (NSString *)propertyNameForTextField:(UITextField *)field {
    static NSDictionary *map;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        map = @{(id)self.fnField: @"firstName",
                (id)self.lnField : @"lastName" };
    });
    return map[field];
}

然后在我们的UITextFieldDelegate方法中,我们这样做:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [_dataObject setValue:textField.text forKey:[self propertyNameForTextField:textField]];
}

请注意,我没有进行错误检查、验证等。这只是为了展示一种将 UI 元素映射到它们应该影响的属性的方法。这是在 iOS 上;Mac OS 上的绑定可用于此用例。

于 2013-06-12T20:41:25.760 回答