我很难将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
一起使用,但是当细节超出页面时我无法滚动它。它也是非常无组织的。我想尝试UITableView
和UIViewController
,但我的代码确实有问题...请帮忙。
CRASH REPORT:
UITableViews
答案 0 :(得分:1)
崩溃很明显。您正试图从(NSArray *)course
获取一个不存在的对象......
我认为您应该首先调试代码并检查数组实际包含的对象数以及请求的数量。
编辑: 没关系,以为我找到了它,但似乎不是问题......
答案 1 :(得分:1)
因为你正在混合表格视图(特别是一个原型单元格),所以事情会变得有些毛茸茸。
为了简化代码,我建议将它们创建为单独的UIViewController子类,然后将一个作为子视图控制器添加到另一个,这样他们将拥有自己的代理,并且没有任何东西可以混合起来。
答案 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处的对象。