UITableViewController里面的UITableView

时间:2014-01-18 12:53:01

标签: ios iphone objective-c uitableview

我很难将UITableViewController与另一个UITableView一起使用。众所周知,UITableViewController有自己的UITableView。我使用UITableView来显示细节;每个UITableViewCell都有一个相应的字段。所以我用一个唯一的标识符命名每个单元格。但是我需要另一个应该包含动态原型单元格的UITableView,这个UITableView's字段与预制UITableView字段不同,行数取决于数组计数。这是我的代码:

@interface CourseJobTVC ()
{ sqlite3 *_db;}

@property (weak, nonatomic) IBOutlet UITableView *cTableLabel;

@end

@implementation CourseJobTVC
@synthesize jDetails=_jDetails;

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    _jDetails = (Jobs *)self.jDetails;

    NSString *title1 = _jDetails.jName;
    self.navigationItem.title = title1;
    [self course];
}


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

-(NSArray *)course;
{
    NSString *sqLiteDb = [[NSBundle mainBundle]pathForResource:@"CourseFindr" ofType:@"sqlite"];
    sqlite3_stmt *statement;
    NSMutableArray *retrieve = [[NSMutableArray alloc] init];
    if (sqlite3_open([sqLiteDb UTF8String], &_db) == SQLITE_OK)
    {
        NSString *query= [NSString stringWithFormat:@"SELECT course. * FROM course INNER JOIN jobsCourse ON jobsCourse.courseID = course.cID WHERE jobsCourse.jobID = %d", _jDetails.jID];

        if (sqlite3_prepare_v2(_db, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_ROW)
            {
                int _cID = sqlite3_column_int(statement, 0);
                char *cNameChars = (char *) sqlite3_column_text(statement,1);
                char *cDescChars = (char *) sqlite3_column_text(statement, 2);
                char *cSchoolChars = (char *) sqlite3_column_text (statement, 3);
                char *cProgramChars = (char *) sqlite3_column_text(statement, 4);
                NSString *_cName =cNameChars?[[NSString alloc]initWithUTF8String:cNameChars]:@"";
                NSString *_cDesc = cDescChars?[[NSString alloc]initWithUTF8String:cDescChars]:@"";
                NSString *_cSchool = cSchoolChars?[[NSString alloc]initWithUTF8String:cSchoolChars]:@"";
                NSString *_cProgram = cProgramChars?[[NSString alloc]initWithUTF8String:cProgramChars]:@"";
                Course *courses = [[Course alloc]
                                   initWithCID:_cID
                                   cName:_cName
                                   cDesc:_cDesc
                                   cSchool:_cSchool
                                   cProgram:_cProgram];
                [retrieve addObject:courses];
            }
            sqlite3_finalize(statement);
        }

    }
    return retrieve;
}



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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
     if(tableView == self.cTableLabel) {NSLog(@"Array count: %d", [self.course count]);
        return [self.course count];}

    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell ;
    if(tableView != self.cTableLabel){
    //jobName
    cell = [self.tableView dequeueReusableCellWithIdentifier:@"jNameCell"];
    if(cell ==nil)
    { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"jNameCell"];
        cell.textLabel.text =_jDetails.jName;}

   //jobEarnings
   cell =[self.tableView dequeueReusableCellWithIdentifier:@"jEarningsCell"];
    if(cell ==nil)
    {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"jEarningsCell"];
        cell.detailTextLabel.text = _jDetails.jEarnings;}

    //jobDesc
    cell =[self.tableView dequeueReusableCellWithIdentifier:@"jDescCell"];
    if(cell == nil)
    { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"jDescLabel"];
        cell.detailTextLabel.text =_jDetails.jDesc;}
   return cell;}

else if(tableView == self.cTableLabel){

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"showCDetails"];
    Course *courses = [self.course objectAtIndex:indexPath.row];
    cell.textLabel.text =courses.cName;
    cell.detailTextLabel.text =courses.cSchool;
    return cell;
}
    return 0;
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier]isEqualToString:@"showCourseDetails"]) {
        CourseTVC  *courseTVC = [segue destinationViewController];

        courseTVC.cDetails = [self.course objectAtIndex:[self.cTableLabel indexPathForSelectedRow].row];
    }
}


@end

我的错误是,当数组计数超过2时,我无法加载预制UITableView ..以及其他UITableView崩溃的详细信息。我已经尝试了{{1与UIViewController一起使用,但是当细节超出页面时我无法滚动它。它也是非常无组织的。我想尝试UITableViewUIViewController,但我的代码确实有问题...请帮忙。

CRASH REPORT:

UITableViews

3 个答案:

答案 0 :(得分:1)

崩溃很明显。您正试图从(NSArray *)course获取一个不存在的对象......

我认为您应该首先调试代码并检查数组实际包含的对象数以及请求的数量。

编辑: 没关系,以为我找到了它,但似乎不是问题......

答案 1 :(得分:1)

因为你正在混合表格视图(特别是一个原型单元格),所以事情会变得有些毛茸茸。

为了简化代码,我建议将它们创建为单独的UIViewController子类,然后将一个作为子视图控制器添加到另一个,这样他们将拥有自己的代理,并且没有任何东西可以混合起来。

Apple有一篇很好的文章: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

答案 2 :(得分:0)

你的代码中有很多问题。 cellforRowAtIndexPath已被破坏。首先,如果阻止你创建/出列3个不同的cells但是所有都在覆盖之前,最后你将返回最后一个。在准备中,您实际上正在访问不在数组中的索引。

每当你打电话给self.course时,它都会做整个提取处理,我建议你创建NSMutableArray instance variable,并且只在第一时间执行fetch或者当欲望时。

-(NSArray *)course{
    if(_courseArray!=nil)
       return courseArray;
   //Other wise do fetch

 }

处理此问题的简洁方法是创建另一个viewcontroller并在其中添加第二个tableview。当用户选择第一个viewcontroller中的行时,推送/显示第二个viewController。如果您正在实现委托didSelectRowAtIndexpath:,请创建第二个viewcontroller并将其推送并设置所需的属性。如果您有segue,则可以创建实施此方法prepareSegue并在properties destination中设置viewcontroller。这将使你的生活变得轻松。

修改

index越界的崩溃意味着当index中没有任何索引4时,您要求array 4处的对象。