通过引用传递

时间:2013-06-12 15:54:54

标签: ios objective-c cocoa-touch uikit

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方法中设置它。

2 个答案:

答案 0 :(得分:1)

该代码没有意义,C(Objective-C)不起作用。

方法的返回值通常在寄存器中,因此没有地址。即使它确实如此,获取对象内部的指针,以便你可以直接捣乱他们是一个非常糟糕的设计模式。

答案 1 :(得分: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上,绑定可用于此用例。