2012-11-09 53 views
0

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

回答

1

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

+0

感谢您的信息 –

1

呃......你可以用NSMutableDictionary来做到这一点。 或填写您从XML


基本上只是ALLOC初始化现有的对象并设置其属性之前建模对象:

例如:

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

例如公司对象

//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新对象的对象/其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更好..我不能给你所有的代码,但我墨水这可能有所帮助 - 我希望

+0

谢谢老兄.... –