在TableView中使用Sections

时间:2014-07-24 05:44:17

标签: ios uitableview

如何将tableview控制器中的数据传递给ViewController?我可以在不使用部分时执行此操作,但是当我使用部分时程序崩溃了?我不明白。

这是我收到的错误消息,它在此行中显示SIGABIT消息:

NSString *mytempName = [NSString stringWithString:[tempObject charName]];

错误讯息:

2014-07-24 06:38:05.465 Passing_Data_With_Two_Sections[469:60b] -[__NSArrayM charName]: unrecognized selector sent to instance 0x8f0d230
2014-07-24 06:38:05.501 Passing_Data_With_Two_Sections[469:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM charName]: unrecognized selector sent to instance 0x8f0d230'

以下是TableView控制器的代码

#import "myTableView.h"

@interface myTableView ()

@end

@implementation myTableView

NSMutableArray *myHeadersArray;
NSMutableArray *myFightersArray;
NSMutableArray *myLadiesArray;
NSMutableArray *myArray;


- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    myHeadersArray = [[NSMutableArray alloc]initWithObjects:@"Fighters", @"Ladies", nil];

    myFightersArray = [[NSMutableArray alloc]init];
    myLadiesArray = [[NSMutableArray alloc]init];


    objectFile *myObject = [[objectFile alloc]init];
    myObject.charName = @"Peter Pan";
    [myFightersArray addObject:myObject];

    myObject = [[objectFile alloc]init];
    myObject.charName = @"Mikey Mouse";
    [myFightersArray addObject:myObject];

    myObject = [[objectFile alloc]init];
    myObject.charName = @"Mrs Duck";
    [myLadiesArray addObject:myObject];

    myObject = [[objectFile alloc]init];
    myObject.charName = @"Mini Mouse";
    [myLadiesArray addObject:myObject];

    myArray = [NSMutableArray arrayWithObjects:myFightersArray, myLadiesArray, nil];
    [super viewDidLoad];

}

#pragma mark - Table view data source

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [myHeadersArray objectAtIndex:section];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [myHeadersArray count];
    //This seems to crash if you go above 2. Which I assume is somehow tied in with the sections.
    //Adding additional names now no longer crash. But if I changed it to myArray then it crashes
    //bitching it being greater 2.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [myArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"myCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = ((myTempObjectFile*)[[myArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]).charName;

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    ViewController *vc = [segue destinationViewController];
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    int myrow = [path row];
    myTempObjectFile *tv = [myArray objectAtIndex:myrow];
    vc.tempObject = tv;
}
@end

以下是我的ViewController中的代码:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize myLabelOutput;
@synthesize tempObject;

- (void)viewDidLoad
{
    NSString *mytempName = [NSString stringWithString:[tempObject charName]];
    [myLabelOutput setText:mytempName];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

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

@end

1 个答案:

答案 0 :(得分:0)

这是因为您尝试为数组调用方法charName。 正如我所见,您将数组存储在数组中,您应该将实现更改为:

myTempObjectFile *tv = [[myArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] 
vc.tempObject = tv;

或只是

myTempObjectFile *tv = myArray[indexPath.section][indexPath.row] 
vc.tempObject = tv;

这个问题的答案。

但我认为在这里我们需要重构:在数组中存储数组并不是很漂亮,最好为这个数据结构创建一个抽象对象。而tempObject名称不具有任何语义含义。