В Objective-C, как передать свойство в качестве аргумента функции, а затем вызвать методы установки / получения? - PullRequest
2 голосов
/ 13 октября 2011

Код, вероятно, лучший способ увидеть, что я пытаюсь сделать:

AcInfo.h:

@interface AcInfo : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString *registrationNumber;
@end

AcInfo.m:

@implementation AcInfo
    @dynamic registrationNumber;
@end

AnotherClass.h:

@interface AnotherClass : NSObject {
}
@property (nonatomic, retain) AcInfo               *detailItem;
@property (nonatomic, retain) IBOutlet UITextField *registrationNumberTextField;

- (void)setDetailItemValueFromUIElement:(id *)uiElement forAcInfoTarget:(id *)acInfoTarget;
@end

AnotherClass.m:

@import "AcInfo.h"

@implementation AnotherClass
@synthesize detailItem, registrationNumberTextField;

- (void)viewDidLoad
{
    [super viewDidLoad];

    registrationNumberTextField.text = @"Test";
    // I expect this to set detailItem.registrationNumber to the value of
    // registrationNumberTextField.text (Test) but it doesn't change anything!
    setDetailItemValueFromUIElement:registrationNumberTextField forAcInfoTarget:detailItem.registrationNumber;
}

- (void)setDetailItemValueFromUIElement:(id *)uiElement forAcInfoTarget:(id *)acInfoTarget
{   
    if ([(id)uiElement isKindOfClass:[UITextField class]]) {
        // This doesn't do anything when it returns!
        (NSString *)acInfoTarget = (UITextField *)uiElement.text
        return;
    }
}

@end

Короче говоря, я хочу, чтобы acInfoTarget вызвал метод получения [detailObject registrationNumber] и метод установки [detailObject setRegistrationNumber]setDetailItemValueFromUIElement: функция ...

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Вы можете установить или прочитать свойства по имени, используя

// setter
NSString *propertyName = @"myProperty";
[object setValue:newValue forKey:propertyName];

// getter
id value = [object valueForKey:propertyName];

Это медленнее, чем использование обычной точечной нотации, и часто (хотя и не всегда) является признаком плохо разработанного кода.

Также обратите внимание, что id является типом указателя, так что вы, вероятно, на самом деле не имеете в виду "(id*)".

Ваш код хочет выглядеть примерно так, я думаю:

- (void)setDetailItemValueFromUIElement:(id)uiElement forAcInfoTarget:(NSString*)acInfoTarget {
    if ([(id)uiElement isKindOfClass:[UITextField class]]) {
        NSString *newValue = ((UITextField*)uiElement).text;
        [self.detailItem setValue:newValue forKey:acInfoTarget];
    }
}
0 голосов
/ 13 октября 2011

Свойства являются просто синтаксическим сахаром для нескольких методов доступа.По сути, они не являются переменными, поэтому вы не должны относиться к ним как к таковым.Если вы хотите повлиять на свойство, то вы хотите вызвать метод.Поэтому вы должны передавать идентификатор и параметр селектора, а не указатель на тип переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...