Недавно я начал разрабатывать для IOS и бороться с объектом Invocation.IOS NSMethodSignature остается nil
Что я имею класса «Location», полученный из NSManagedObject (это часть модели CoreData)
@interface Location (CoreDataGeneratedAccessors)
- (void)addHasLocationInfoObject:(Info *)value;
...
@end
У меня также есть другие классы, которые имеют аналогичные подписи (addHasWorkorderInfoObject, ...).
Эти объекты InfoObject имеют ограничения со своими «родительскими объектами», в этом случае «Местоположение» имеет несколько объектов «LocationInfo», которые я извлекаю из базы данных и хочу добавить в местоположение. То же самое должно произойти со всеми объектами, которые назначены InfoObjects.
Теперь я пытаюсь создать метод, который будет работать для любого объекта, который придерживается соглашений об именах, зафиксированных проектной документацией (Location -> addHasLocationInfoObject, XY -> addHasXYInfoObject ...).
Моего подхода для добавления информации к объектам сейчас:
-(void)setInfoForObject:(NSManagedObject *)managedObject withClass:(NSString *)className
NSString *noteRefName = [[NSString alloc]init];
noteRefName = [NSString stringWithFormat:@"%@Info", className];
NSString *addInfoSelectorName = [[NSString alloc]init];
addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object::", infoClassName];
SEL addInfoPropertySelector = NSSelectorFromString(addInfoSelectorName);
NSMethodSignature *signature = [[managedObject class] methodSignatureForSelector:addNotePropertySelector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:managedObject];
[invocation setSelector:addInfoPropertySelector];
[invocation setArgument:¬e atIndex:2];
Однако это дает мне ошибку, так как объект Signature получает значение ноля. Я попытался найти проблему и, похоже, связан с именем «:» в имени «Селекторы».
Но я не понимаю, сколько и где и почему я должен их установить? Мне также кажется, что не удается найти страницу Документов, в которой рассказывается, как сделать это правильно.
Anny help оценили, спасибо заранее!
PS. Я запустил имя SelectorName и имя класса, и оба они написаны правильно.
не уверен, я понимаю, почему вы сложили два «::» в имени метода, а в сигнатуре метода есть только один? – kovpas
, потому что он ни работал без: ни с одним:, поэтому я дал ему выстрел ^^ – billdoor
NSLog сгенерированное имя селектора. ("addHas (null) Object:" не является допустимым именем селектора, например.) –