0

教師のレジストリを管理する小さなアプリを開発しようとしています。私のアプリは次のように機能します:

  1. UIViewControllerクラスを選択するために (風景のみ)を提示します。
  2. ボタン (例: 1F) を押すと、メソッドを呼び出してXML、生徒の名前と姓を取得したファイルを解析します。だから私はこの名前と姓をNSArrayofに入れましたNSDictionary(arrayStudents[0] = dictStudentsそしてdictStudents3 で構成されていkey: number, name and surnameます)。
  3. 2 番目の例でUIViewControllerUITableView、画面の左側に を、右側に通常のビューを配置しました。でUITableView生徒の名前と姓を表示し、右側に をタップして選択した生徒のテストに関するスコアを表示しUITableViewます。

これは私viewControllerのように見える方法です:

viewController UI

私の問題は、UITableView. を を2 番目に接続してからtableView、デリゲートと dataSource を 2 番目に接続しましたが、アプリはまだクラッシュしています。テーブル ビュー クラスと 2 番目のビュー コントローラーのコードをここに投稿するので、この問題を解決するのに役立ちます。IBOutletviewControllerviewController

ここに my の接続タブが表示されますtableView

接続タブ

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

    #import <UIKit/UIKit.h>

    @interface DetailsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
    @property (weak, nonatomic) IBOutlet UITableView *tableViewStudentsNameAndSurname;
    @property (weak, nonatomic) IBOutlet UIView *viewDetails;
    @property (weak, nonatomic) IBOutlet UILabel *labelName;
    @property (weak, nonatomic) IBOutlet UILabel *labelSurname;
    @property (weak, nonatomic) IBOutlet UITextField *textFieldTest1;
    @property (weak, nonatomic) IBOutlet UITextField *textFieldTest2;
    @property (weak, nonatomic) IBOutlet UITextField *textFieldTest3;
    @property (weak, nonatomic) IBOutlet UITextField *textFieldText4;
    @property (weak, nonatomic) IBOutlet UITextView *textViewValutation;
    @property (weak, nonatomic) IBOutlet UILabel *labelTotalScore;
    @property (nonatomic, strong) NSString *fileName;

    - (IBAction)saveDataToPlistFile:(id)sender;
    @end

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.m

#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 に送信されました

その問題を解決するのを手伝ってくれませんか? 私が間違っていることは何ですか?

4

1 に答える 1

1

さて、私はObjective Cにかなり慣れていないので、これは専門家の意見ではありません. しかし、私が得たものから、それは DetailsViewController クラスにあるはずのデリゲートメソッドを探しています。テーブルビューデリゲート/データソースを DetailsViewController クラスに接続しました。クラスを UITableView のデリゲートクラスとしても指定する必要があると思います。DetailsViewController.h で:

@interface DetailsViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>

次に、DetailsViewController.m ファイルに UITableView Delegate メソッドをプラグインします。しかし、私が得られないのは、なぜ2つのテーブルビュークラスを使用しているのですか? tableView クラスを使用する場合は、 DetailsViewController::viewDidLoad で初期化し、単純に:

[self.view addSubView:tableView]  

クラスに tableViewStudentsNameAndSurname が必要だとは思いません。

于 2013-04-21T08:24:07.797 に答える