2013-04-21 6 views
0

Я пытаюсь разработать крошечное приложение для управления реестром для учителя. Мое приложение работает так:UITableView в UIViewController на iPad

  1. Представляю UIViewController (только пейзаж), чтобы выбрать класс.
  2. Когда я нажимаю кнопку (например: 1F), я вызываю метод для разбора файла XML, в котором я получил имя и фамилию студентов. Поэтому я помещал это имя и фамилию в NSArray из NSDictionary (arrayStudents[0] = dictStudents и dictStudents составлен 3 key: number, name and surname).
  3. Во втором UIViewController Я положил UITableView в левой части экрана и нормальный вид справа. В UITableView я хочу иметь имя и фамилию студентов, а справа я хочу показать оценку о тестировании студента, нажав на UITableView.

Это как мой viewController выглядит следующим образом:

viewController UI

Моя проблема заключается в том, чтобы заполнить UITableView. Я подключил tableView с IBOutlet к моему второму viewController, а затем подключил делегат и источник данных ко второму viewController, но приложение все еще терпит крах. Я выложу здесь код класса table view и второго контроллера, поэтому вы можете помочь мне исправить эту проблему.

Здесь вы можете увидеть вкладку подключения моего tableView:

connection tab

tableView.h

#import <UIKit/UIKit.h> 

@interface tableView : UITableView <UITableViewDelegate,UITableViewDataSource> 
@property (nonatomic, strong) NSMutableArray *arrayStudents; 
@end 

tableView.m

#import "tableView.h" 

@implementation tableView 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

#pragma mark - Table view data source 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.arrayStudents.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    cell.textLabel.text = [self.arrayStudents[indexPath.row] objectForKey:@"name"]; 
    cell.detailTextLabel.text = [self.arrayStudents[indexPath.row] objectForKey:@"surname"]; 

    return cell; 
} 

#pragma mark - Table view delegate 

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

} 

@end 

detailsViewController.h

detailsViewController.m

#import "DetailsViewController.h" 
#import "ParserXML.h" 
#import "tableView.h" 

@interface DetailsViewController() { 
    ParserXML *parser; 
    tableView *table; 
} 
@end 

@implementation DetailsViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

    } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    parser = [[ParserXML alloc] init]; 
    NSLog(@"DetailsViewController: %@", self.fileName); 
    parser.fileName = self.fileName; 
    [parser parseXML]; 
    table = [[tableView alloc] init]; 
    table.arrayStudents = [parser.arrayStudents mutableCopy]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)saveDataToPlistFile:(id)sender { 

} 
@end 

ParserXML.h

#import <Foundation/Foundation.h> 

@interface ParserXML : NSObject <NSXMLParserDelegate> 
@property (nonatomic, strong) NSMutableArray *arrayStudents; 
@property (nonatomic, strong) NSDictionary *dictStudents; 
@property (nonatomic, strong) NSString *fileName; 

- (void) parseXML; 
@end 

ParserXML.м

#import "ParserXML.h" 

@interface ParserXML() { 
    NSXMLParser *nameStudentParser; 
    NSString *pathXmlFile; 
} 
@end 

@implementation ParserXML 

- (id) init { 
    self = [super init]; 
    if (self) { 
     self.arrayStudents = [[NSMutableArray alloc] init]; 
     pathXmlFile = [[NSBundle mainBundle] pathForResource:self.fileName ofType:@"xml"]; 
    } 
    return self; 
} 

- (void) parseXML { 
    NSURL *xmlUrl = [NSURL URLWithString:pathXmlFile]; 
    NSString *host = [xmlUrl host]; 
    if (xmlUrl == nil || host == nil) { 
     NSData *data = [[NSData alloc] initWithContentsOfFile:pathXmlFile]; 
     nameStudentParser = [[NSXMLParser alloc] initWithData:data]; 
    } else { 
     nameStudentParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlUrl]; 
    } 
    [nameStudentParser setDelegate:self]; 
    [nameStudentParser setShouldProcessNamespaces:NO]; 
    [nameStudentParser setShouldReportNamespacePrefixes:NO]; 
    [nameStudentParser setShouldResolveExternalEntities:NO]; 
    [nameStudentParser parse]; 
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    NSLog(@"File trovato inizio il parsing del documento"); 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 
    NSLog(@"Errore Parsing"); 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    if ([elementName isEqualToString:@"students"]) { 
    } else if ([elementName isEqualToString:@"student"]) { 
     NSString *numberValue = attributeDict[@"number"]; 
     NSString *nameValue = attributeDict[@"name"]; 
     NSString *surnameValue = attributeDict[@"surname"]; 

     //Inserire dizionario di array 
     self.dictStudents = @{@"number": numberValue, 
           @"name": nameValue, 
          @"surname" : surnameValue}; 

     [self.arrayStudents addObject:self.dictStudents]; 
     NSLog(@"arrayStudents dim = %d", self.arrayStudents.count); 
    } 
} 

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

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    NSLog(@"ArrayFuels = %@", self.arrayStudents); 
} 

@end 

При запуске приложения Xcode говорит:

[DetailsViewController Tableview: numberOfRowsInSection]: непризнанные селектор направлен например 0x751da40

Можете ли вы помочь мне исправить проблема? Что я делаю неправильно?

ответ

1

Итак, я довольно новичок в объективе C, поэтому это не экспертное мнение. Но из того, что я получаю, он ищет метод делегата, который должен быть в классе DetailsViewController. Вы связали свой делегат/источник данных таблицы с классом DetailsViewController, я думаю, вы должны указать класс как класс делегата UITableView. В DetailsViewController.h:

@interface DetailsViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> 

, а затем включите в методах UITableView делегированными в DetailsViewController.m файле. Хотя, что я не понимаю, почему вы используете 2 класса представления таблиц? Если вы хотите использовать класс Tableview, почему бы не инициализировать в DetailsViewController :: viewDidLoad и просто:

[self.view addSubView:tableView] 

Я не думаю, что есть необходимость в tableViewStudentsNameAndSurname в своем классе.

+0

Так что я должен использовать методы myViewView.m в DetailsViewcontroller.m? – lucgian841

+0

Это работает !!!! Большое спасибо! – lucgian841

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