2012-11-09 50 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

謝謝老兄.... –