Синтаксический анализ XML для iOS, отображение результатов в табличном представлении и отправка в новое табличное представление

Цель моего приложения - проанализировать некоторый XML, отобразить один элемент xml в табличном представлении, а затем попросить пользователя щелкнуть ячейку, и он перейдет к новому табличному представлению, где отображаются остальные данные для этого элемента. Первое представление таблицы, которое отображает только список, работает нормально, но по какой-то причине я не могу заставить работать новый контроллер представления. Ниже приведен код, который я использую. Первый контроллер представления отображается в виде таблицы; текущийCallType. Я хочу, чтобы пользователь мог щелкнуть эту ячейку таблицы, а затем перейти к новому представлению таблицы, где отображаются единицы измерения, станция и местоположение. Любая помощь будет УДИВИТЕЛЬНОЙ! благодаря.

Контроллер представления для первого представления таблицы:

#import "ThirdViewController.h"
#import "UnitsXMLParser.h"
#import "DetailViewController"

@implementation ThirdViewController
@synthesize unitsTableView;
@synthesize currentCallType, station, location, units;

XMLParser1 *xmlParser;

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[xmlParser units] count];
}

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

static NSString *CellIdentifier = @"Cell";

Units *currentCall = [[xmlParser units] objectAtIndex:indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];

}

// Set up the cell...
cell.textLabel.text = [currentCall currentCallType];

return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 55;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath {


DetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
    [self.navigationController pushViewController:detail animated:YES];

}


#pragma mark - View lifecycle

- (void)viewDidLoad
{
[super viewDidLoad];

xmlParser = [[XMLParser1 alloc] loadXMLByURL:@"http://localhost:8888/units.xml"];

}

Синтаксический анализатор XML:

#import <Foundation/Foundation.h>
#import "UnitsXMLParser.h"

@implementation XMLParser1
@synthesize units = _units;


NSMutableString *currentNodeContent;
NSXMLParser     *parser;
Units       *currentCall;
bool            isStatus;

-(id) loadXMLByURL:(NSString *)urlString
{
_units          = [[NSMutableArray alloc] init];
NSURL *url      = [NSURL URLWithString:urlString];
NSData  *data   = [[NSData alloc] initWithContentsOfURL:url];
parser          = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = (NSMutableString *) [string     stringByReplacingOccurrencesOfString:@"~" withString:@""];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementname isEqualToString:@"station"])
{
    currentCall = [Units alloc];
    isStatus = YES;
}
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (isStatus)
{
    if ([elementname isEqualToString:@"units"])
    {
        currentCall.units = currentNodeContent;
    }
    if ([elementname isEqualToString:@"name"])
    {
        currentCall.currentCallType = currentNodeContent;
    }
    if ([elementname isEqualToString:@"stationid"])
    {
        currentCall.station = currentNodeContent;
    }
    if ([elementname isEqualToString:@"address"])
    {
        currentCall.location = currentNodeContent;
    }
}
if ([elementname isEqualToString:@"station"])
{
    [self.units addObject:currentCall];
    currentCall = nil;
    currentNodeContent = nil;
}
}
@end

person Jon Erickson    schedule 24.08.2012    source источник
comment
У вас нет никаких толчков в вашем коде...?   -  person ohr    schedule 25.08.2012
comment
Я понимаю, что у меня нет толчков, я искал кого-то, кто помог бы мне с ними. То, что я использовал все это время, не работало.   -  person Jon Erickson    schedule 25.08.2012
comment
Я отредактировал свой код выше, чтобы добавить толчок, который я использовал.   -  person Jon Erickson    schedule 25.08.2012
comment
Ваша проблема в том, что когда вы нажимаете на ячейку таблицы в своем первом tableViewController, ничего не происходит? Или что, когда ваше приложение переходит к контроллеру подробного представления, там не появляются данные?   -  person jonkroll    schedule 25.08.2012
comment
Нажимаю на ячейку таблицы и ничего не происходит.   -  person Jon Erickson    schedule 25.08.2012


Ответы (1)


дальний выстрел; но ваш проект настроен на использование UINavigationController ? Ваши контроллеры представления не будут содержаться или управляться UINavigationController, если вы не начнете с правильного шаблона проекта или вручную не добавите файл UINavigationController . Если контроллер представления, содержащий ваш опубликованный код, не поддерживается контроллером навигации, [self.navigationController pushViewController:detail animated:YES] ничего не сделает.

Кроме того, убедитесь, что вы подключили UITableViewDelegate в дополнение к UITableViewDataSource , чтобы ваш код перехватил выбор строки.

Я спрашиваю только потому, что вы явно не указываете, что вы настроили свой проект для использования UINavigationController , или подтверждаете, что вы подключили и делегата, и источника данных в Interface Builder.

person bernese    schedule 24.08.2012
comment
Нет, проект построен на приложении с вкладками через раскадровку. Итак, в основном, что мне нужно сделать, это добавить вкладку в UINavigationController, которая затем будет управлять двумя моими контроллерами представления? - person Jon Erickson; 25.08.2012
comment
UINavigationController является подклассом UIViewController. Если вы использовали шаблон приложения с вкладками для настройки проекта, настройка вашего UITabBarController находится в вашем делегате приложения, поэтому вы будете выполнять свою настройку там. Оберните свой UIViewController внутри UINavigationController и передайте этот UINavigationController в UITabBarController. Прочтите документацию по UINavigationController; метод init принимает корневой контроллер представления, и вам следует знать о различных компонентах UINavigationController. - person bernese; 25.08.2012