Objective-C创建动态对象

时间:2012-11-09 14:17:39

标签: objective-c xml cocoa

解析XML文件后,我想根据xml的内容创建动态对象,如textbox和按钮。
我解析了我的xml并检索了数据 我为XMLParser创建了一个单独的类,并使用我的vieDidload方法进行了调用。 是否可以从我的mainViewController类中调用XMLParser类中的方法来创建动态对象。

2 个答案:

答案 0 :(得分:1)

您可以创建自己的类,它将读取已解析的值,并根据您继续创建所有GUI对象。这不是很困难。甚至你可以添加绑定,连接,约束等。 在为我的项目创建框架时,我实际上做了同样的事情。我不能发布代码作为其版权,但我可以分享一些命中。我提到的一个基本提示。

答案 1 :(得分:1)

嗯......你可以使用NSMutableDictionary来做到这一点。 或者您可以从xml

填充之前建模的对象

基本上只是为现有对象分配init并设置其属性:

示例:

//parse xml
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];
parser.delegate = (id<NSXMLParserDelegate>)self;
[parser parse];

e.g。公司对象

//callback from parser
- (void)didStartFirmaWithParser:(NSXMLParser*)parser andAttributes:(NSDictionary*)dict {
[[self __didStartEntity:@"RLStoreFirma" withParser:parser] didStartFirmaWithParser:parser andAttributes:dict];
}

//general callback, sets the parsers delegate to THIS new object which then gets filled
- (id)__didStartEntity:(NSString*)name withParser:(AQXMLParser*)parser {
NSEntityDescription *entity = [[store.managedObjectModel entitiesByName] objectForKey:name];
M42StoreEntry *entry = (id)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:store.managedObjectContext];

entry.store = self->store;
parser.delegate = entry;

return entry;
} 

要填充的对象

#import "RLStoreFirma(info).h"

@implementation RLStoreFirma (info)
- (void)didStartFirmaWithParser:(AQXMLParser*)parser andAttributes:(NSDictionary*)dict {
}
-  (void)didEndFfkbWithParser:(AQXMLParser*)parser {
self.fkb = currentXMLCharacters;
}
-  (void)didEndFfirWithParser:(AQXMLParser*)parser {
self.name = currentXMLCharacters;
}
-  (void)didEndFirmaWithParser:(AQXMLParser*)parser {
if(!self.name) {
    self.name = self.fkb;
}
[self didEndMainWithParser:(AQXMLParser*)parser];
}

在运行时生成新对象不允许使用iphone sdk / it objc运行时


#pragma mark parser magic

- (SEL) __startSelectorForElement: (NSString *) element
{
NSString * str = nil;
NSMutableString * eSel = [NSMutableString stringWithString: [[element substringWithRange: NSMakeRange(0,1)] uppercaseString]];

if ( [element length] > 1 )
{
    [eSel appendString: [element substringFromIndex: 1]];

    NSRange range = [eSel rangeOfString: @"-"];
    for ( ; range.location != NSNotFound; range = [eSel rangeOfString: @"-"] )
    {
        NSString * cap = [[eSel substringWithRange: NSMakeRange(range.location+1, 1)] uppercaseString];
        range.length += 1;
        [eSel replaceCharactersInRange: range withString: cap];
    }
}

str = [NSString stringWithFormat: @"didStart%@WithParser:andAttributes:", eSel];

return ( NSSelectorFromString(str) );
}

语法糖使NSParser更好..我不能给你所有的代码,但我认为这可能会有所帮助 - 我希望