2014-09-24 106 views
-1

我正在爲Xcode6中的iOS設備開發一個應用程序(剛剛從xcode5更新),在某處用戶按下按鈕,然後在每個單元格中很好地合併了信息時看到tableview,是相應對象的細節,並且當他/她按下按鈕時,該對象由標識符數值指定。將TBXML分析器轉換爲NSXML解析器

所以基本上,使用segue方法捕獲用戶在前一個視圖(SecondViewController.m)中輸入到文本字段中的數值,然後是另一個視圖,其中只有一個按鈕被看到,該數字就是標籤。用戶按下按鈕並彈出一個tableview,顯示該對象的詳細信息。

數據(詳細信息)從xml URL中檢索,一切工作正常使用我的項目與TBXML作爲我的分析器。

但最近我在真實設備(iphone5s)上測試了應用程序,當按下按鈕以查看tableview和我的對象細節時,它不會發生任何事情,就好像按鈕不在那裏一樣,至少功能,但在模擬器的作品精彩。

我的老闆讓我更改我的代碼,使用NSXML解析器代替TBXML解析器。但我已經看過教程,但我並不簡單明白。

有人可以幫我翻譯我的TBXML代碼塊爲NSXML代碼請。 順便提一下,「對象」是一棵樹,詳細信息是該樹的具體信息,如溼度,分類,高度,溫度等。

這裏是一個XML鏈接:http://papvidadigital.com/risi/?nid=83 83)

是一個非常簡單的XML。

這裏是涉及該XML解析的代碼。

//XML 


//LOADING THE XML FILE 
//create link 




NSString *buildingURL = [NSString stringWithFormat:@"http://papvidadigital.com/risi/?nid=%@", _passingValueToTable]; 




NSURL *myUrl = [NSURL URLWithString:buildingURL]; 

//setting data 
NSData *myData = [NSData dataWithContentsOfURL:myUrl]; 

TBXML *sourceXML = [[TBXML alloc] initWithXMLData:myData error:nil]; 


//EXTRACT ELEMENTS 
TBXMLElement *rootElement = sourceXML.rootXMLElement; 

TBXMLElement *datoElement = [TBXML childElementNamed:@"dato" parentElement:rootElement]; 



//EXTRACT ATTRIBUTES 

//EXTRACT element 

//NID 
//TBXMLElement *nidElement = [TBXML childElementNamed:@"NID" parentElement:datoElement]; 
//NSString *nidElementString = [TBXML textForElement:nidElement]; 
//NSLog(@"NID: %@\n", [nidElementString lowercaseString]); 

//taxonomia 
TBXMLElement *taxonomiaElement = [TBXML childElementNamed:@"taxonomia" parentElement:datoElement]; 
NSString *taxonomiaElementString = [TBXML textForElement:taxonomiaElement]; 
NSLog(@"taxonomia: %@\n", [taxonomiaElementString lowercaseString]); 



//diametro 
TBXMLElement *diametroElement = [TBXML childElementNamed:@"diametro" parentElement:datoElement]; 

NSString *diametroElementString = [TBXML textForElement:diametroElement]; 
NSString *diametroElementText = [ NSString stringWithFormat:@"%@ cm", diametroElementString]; 

    NSLog(@"diametro: %@\n", [diametroElementString lowercaseString]); 

//Verificar y validar icono correspondiente 
NSString *ThumbImageDiametro; 
NSInteger diametroElementNumber = [diametroElementString integerValue]; 
if(diametroElementNumber >= 30){ 
    ThumbImageDiametro = @"diametroalto.png"; 
}else if(diametroElementNumber >= 15 && diametroElementNumber < 30){ 
    ThumbImageDiametro = @"diametromedio.png"; 
}else if(diametroElementNumber < 15){ 
    ThumbImageDiametro = @"diametropequeño.png"; 
} 

對不起,有些條款是西班牙文。基本上我解析XML,發現每個孩子的「dato」,然後保存「>」和「<」內的內容作爲字符串值,以便稍後將其放入對象數組中,我必須將數據放入我的單元格中。正如你所看到的,我用「diametroElementNumber」做了一些if-else語句,這是因爲相應的ThumbImageDiametro(相應單元格中的圖像)將根據「diametroElementNumber」值進行更改。 (樹直徑大小)。我用一個簡單的轉換爲整數。

這是我的對象陣列的一個小例子:

_Description = @[taxonomiaElementString, 
       PlantadoElementString, 
       diametroElementText]; 

這是從我的圖片對象陣列(在每個小區中的圖像):

_Images = @[@"taxonomia.png", 
      @"fechadeplantacion.png", 
      ThumbImageDiametro]; 

這是我的對象陣列固定每個單元格的標題:

_Title = @[@"Taxonomía", 
      @"Año de Plantado", 
      @"Diámetro"]; 

這就是我如何將數據放入每個單元格:

//Put data into CELLS 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 



    //for cells that have TableCell as identifier 
    static NSString *CellIdentifier = @"TableCell"; 
    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 

    long row = [indexPath row]; 
    cell.TitleLabel.text = _Title[row]; 

    cell.DescriptionLabel.text = _Description[row]; 
    //put corresponding image 
    cell.ThumbImage.image = [UIImage imageNamed:_Images[row]]; 

    [cell setBackgroundColor:[UIColor whiteColor]]; 

    return cell; 

} 

最後的實現代碼如下一些通用/默認的方法:

//calculates and returns number of sections in tableview controller 
- (NSInteger)numberOfSelectionsInTableView:(UITableView *)tableView 
{ 
    return 1; //number of sections 
} 
//calculates and returns number of rows in the section 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return _Title.count; 
} 

請有人可以幫助我改變什麼,以停止使用外部TBXML.h & TBXML.m文件,然後用分析是必要的,而是使用NSXML解析器來完成上述操作。

基本上我只想爲此翻譯的代碼。

預先感謝您

回答

0

如果您需要將代碼轉換爲NSXML分析器,然後爲NSXMLParser類的文檔和NSXMLParserDelegate協議是你最好的開始。

要打破它的基本知識,你基本上可以按照以下步驟獲得一個良好的開端:

  1. 宣佈類(可能是一個視圖控制器?),將其置於符合NSXMLParserDelegate協議你的課堂標題。
  2. 創建NSXMLParser的實例變量(或更好的屬性)。你甚至可以從URL拉下數據右像這樣:

    self.treeParser = [[NSXMLParser alloc] initWithContentsOfURL:myUrl];

  3. 確保設置self作爲委託,所以你可以趕上委託回調。你可以在這裏處理的附加功能太多,如解析外部實體等

    self.treeParser.delegate = self; self.treeParser.shouldResolveExternalEntities = YES;

  4. 處理所需的NSXMLParserDelegate方法,最有可能的:

    • parser:didStartElement:...
    • parser:didEndElement:...,`
    • parser:foundCharacters:
    • parser:parseErrorOccurred:

上面列出的委託方法做的大部分工作。您可以爲當前已分析的對象創建實例變量(或屬性),並在分析完成時將其存儲。在構建樹形數據等一致對象時,最好創建一個自定義類。因此,對於您的示例XML,您可以使用分類和分類等屬性的Tree類來存儲服務中的數據。然後,您可以遵循的基本格局解析

  1. didStartElement:,如果元素是「拿督」,那麼你要分配/初始化您的自定義Tree類,並將其存儲到一個實例或屬性,currentTree可能。
  2. foundCharacters:中,可能會將傳入的字符存儲到實例或屬性currentString
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
     if (!self.currentString) { 
      // currentString is an NSMutableString typed property 
      self.currentString = [[NSMutableString alloc] initWithCapacity:50]; 
     } 
     [self.currentString appendString:string]; 
    } 
  • didEndElement:,如果元素是要存儲到類「taxonomia」或「plantado」或任何其他字段中,然後,指定currentString給那個班級成員。你也可以使用KVC(假設你的類要求,並且完全相符的XML字段)執行以下操作:

    [self.currentTree setValue:self.currentString forKey:elementName];

  • 這將節省您做一些重複的語句的麻煩就像

    if ([elementName isEqualToString:@"taxonomia"]) {...} 
    

    你也想在這裏設置currentStringnil,所以你最終不會創建一個長的可變串!此外,如果在didEndElement中elementName是「dato」,那麼您知道該對象已完成,因此您可以將其添加到集合中或在其中執行其他操作。

    當然,您應該實施parseErrorOccurred:來處理您可能遇到的任何錯誤。

    這些是基礎知識。您可以使用NSXMLParser類和委託協議的更多功能進行擴展。你的tableview只需要一些小的調整來處理你的Tree類對象,這將是非常值得的。