2010-06-21 2 views
0

i разбор XML-файла. когда я добавляю значения в массив, массив все еще null, я не знаю причины. Может быть, причина в том, что я использую этот массив в двух классах. есть .h файлыArray имеет значение null после добавления значений

xmlparser.h

#import <UIKit/UIKit.h> 

@class SightsTableViewController, Sight; 

@interface XMLParser : NSObject { 

    NSMutableString *currentElementValue; 
    NSMutableArray *allSights; 
    NSMutableArray *Arr; 
    SightsTableViewController *sightsDelegate; 
    Sight *aSight; 
} 

- (XMLParser *) initXMLParser; 
- (XMLParser *) arrayResult; 

@property (nonatomic, retain) NSMutableArray *allSights; 
@end 

SightsTableViewController.h

#import <UIKit/UIKit.h> 

@class SightsTableViewController, SightsDetailController; 

@interface SightsTableViewController : UITableViewController <UITableViewDelegate>, UITableViewDataSource> { 
    IBOutlet UITableView *sightsTableView; 
    NSMutableArray *allSights; 
    NSMutableArray *Arr; 
    SightsDetailController *sightsDetailController; 
    SightsTableViewController *sightsDelegate; 

} 

@property (nonatomic, retain) NSMutableArray *allSights; 
@property (nonatomic, retain) NSMutableArray *Arr; 
@property (nonatomic, retain) SightsDetailController *sightsDetailController; 


@end 

и .m файлов

я проводки только методы, которые я с помощью массивов. xmlparser.m

#import "XMLParser.h" 
#import "SightsTableViewController.h" 
#import "Sight.h" 

@implementation XMLParser 
@synthesize allSights; 
- (XMLParser *) arrayResult { 

    Arr = [[NSMutableArray alloc] init]; 
    [Arr addObject:@"fisrt"]; 
    [Arr addObject:@"two"]; 
    [Arr addObject:@"three"]; 
    [Arr addObject:@"four"]; 
    [Arr addObject:@"five"]; 
    NSLog(@"%@", Arr); 

    return Arr; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict { 

     if([elementName isEqualToString:@"Sights"]) { 
       //Initialize the array. 
       sightsDelegate.allSights = [[NSMutableArray alloc] init]; 
     } 
     else if([elementName isEqualToString:@"Sight"]) { 

       //Initialize the sight. 
       aSight = [[Sight alloc] init]; 

       //Extract the attribute here. 
       aSight.sightID = [[attributeDict objectForKey:@"id"] integerValue]; 

       NSLog(@"Reading id value :%i", aSight.sightID); 
     } 

     NSLog(@"Processing Element: %@", elementName); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

      if([elementName isEqualToString:@"Sights"]) 
       return; 

      //There is nothing to do if we encounter the Sight element here. 
      //If we encounter the Sight element howevere, we want to add the sight object to the array 
      // and release the object. 
      if([elementName isEqualToString:@"Sight"]) { 
       //adding values 
       [allSights addObject:aSight]; 

       [aSight release]; 
       aSight = nil; 
      } 
      else 
      [aSight setValue:currentElementValue forKey:elementName]; 

      [currentElementValue release]; 
      currentElementValue = nil; 
    } 
    - (void) dealloc { 
     [Arr release]; 
     [aSight release]; 
     [allSights release]; 
     [super dealloc]; 
} 

@end 

SightsTableViewController.m

#import "SightsTableViewController.h" 
#import "SightsDetailController.h" 
#import "XMLParser.h" 
#import "Sight.h" 

@implementation SightsTableViewController 
@synthesize sightsDetailController, allSights, Arr; 
- (void)viewDidLoad { 
     [super viewDidLoad]; 


     NSURL *url = [[NSURL alloc] initWithString:@"http://onsnab.ru/sights.xml"]; 
     NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

     //Initialize the delegate. 
     XMLParser *parser = [[XMLParser alloc] initXMLParser]; 

     //Set delegate 

     [xmlParser setDelegate:parser]; 

     //Start parsing the XML file. 
     BOOL success = [xmlParser parse]; 

     if(success) 
      NSLog(@"No Errors"); 
     else 
      NSLog(@"Error Error Error!!!"); 

     [[XMLParser alloc] arrayResult]; 
      //showing NULL :(
     NSLog(@"%@", sightsDelegate.allSights); 
     self.navigationItem.title = @"Sights"; 

    } 

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
      return [sightsDelegate.allSights count]; 
    } 

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

      static NSString *CellIdentifier = @"Cell"; 

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
      if (cell == nil) { 
       cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
      } 
      NSString *cellValue = [sightsDelegate.allSights objectAtIndex:indexPath.row]; 
      cell.text = cellValue; 

      // Set up the cell 
      return cell; 
} 

- (void)dealloc { 
     [sightsDelegate release]; 
     [sightsDetailController release]; 
     [super dealloc]; 
} 


@end 
+0

Вы протестировали свой код в XCode? Некоторые из ваших методов вложены друг в друга, вместо того, чтобы последовательно (парсером '- (void) arrayResult' и' - (void) парсером: (NSXMLParser *) didStartElement: namespaceURI: qualifiedName: attributes: '). Также, пожалуйста, не вводите код как беспорядок - некоторое форматирование, и вам будет легче понять ваш код (и больше шансов для вас, что кто-то поможет). – kpower

+0

Да, я протестировал, приложение tha laiuching, но массив равен нулю. ( – sherilyn

+0

Является ли массив, который вы пытаетесь использовать в обоих классах «Arr»? Если это так, вы никогда не передаете его назад и вперед. Просто потому, что он имеет одно и то же имя в двух местах, он не делает его одним и тем же объектом. – CajunLuke

ответ

1

Ваш код немного перемешаны, так что я с трудом читать. Мои комментарии о том, как NSArray и Objective-C работают больше, чем то, как написан ваш код.

Контрольная переменная NSArray будет равна нулю, если она никогда не инициализируется. Вы можете отправить сообщение в Objective-C в нулевую ссылку, а Objective-C не будет жаловаться. Он ничего не сделает. Такое поведение довольно удобно в некоторых ситуациях, но усугубляется в других.

Чтобы проверить, не инициализирован ли ваш NSArray, поместите контрольную точку на строки кода, которые инициализируют ваш NSArray. Затем запустите приложение. Если он никогда не останавливается в точке останова, вы нашли свою ошибку.

+0

я инициализируется массив в xmlpaser.m по 'sightsDelegate.allSights = [[NSMutableArray Alloc] инициализации];' вопрос заключается в том, чтобы использовать массив в двух классах – sherilyn

+0

я редактировал код в лучшую сторону для. наблюдая – sherilyn

+0

проблема массив allSights. – sherilyn

1

По моему опыту, когда у меня есть тайные массивы и словари, которые просто не будут принимать какие-либо значения, которые я им вставляю, я всегда могу отследить их до того, что структура не была инициализирована. Любое сообщение, отправленное объекту nil (включая -addObject), является тихим no-op. Поэтому, если все идет не так, первое, что может быть подозрительным, это то, что вы разговариваете с ноль.

EDIT:

Например, предположим, что у вас есть контроллер представления, которое позволяет вводить текст в UITextField, и добавляет строку, что вы положили в NSMutableArray. Таким образом, вы могли бы пойти:

MyViewController.h:

@implementation MyViewController : UIViewController { 
    UILabel *textInput; 
    NSMutableArray *enteredStrings; 
} 

@property (nonatomic, retain) IBOutlet UITextField *textInput; 
@property (nonatomic, retain) NSMutableArray *enteredStrings; 

-(IBAction)addTextToArray:(id *)sender 

@end 

Тогда MyViewController.m:

@implementation MyViewController 

@synthesize textInput; 
@synthesize enteredStrings; 

-(void)viewDidLoad 
{ 
//notice the lack of "self.enteredStrings = [NSMutableArray array]" right here! 
} 

-(IBAction)addTextToArray:(id *)sender 
{ 
    [self.enteredStrings addObject:self.textInput.text]; 
} 

So. Эта последняя строка не даст вам никаких ошибок, но она также не сработает. [self.enteredStrings count] будет упрямо оставаться в 0. Потому что это свойство указывает на указатель nil, а не на объект NSMutableArray.

+0

не могли бы вы привести пример. – sherilyn

Смежные вопросы