0

我现在正在学习UITableViewiOS开发课程。我想在我的 tableView 中实现三个部分,但是当我点击tabBarItem包含tableView. 我的代码如下:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = @"Settings";
        self.tabBarItem.image = [UIImage imageNamed:@"19-gear.png"];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *list1 = [[NSMutableArray alloc] initWithObjects:@"fbfb", @"dfhbfh", @"rtjtj", @"rgrrth", @"grhh", @"tyjtyj", nil];
    NSArray *list2 = [[NSMutableArray alloc] initWithObjects:@"fgngg", @"yjyj", @"rhrht", @"rthfh", @"tjtyjyj", @"fsfsdf", nil];
    NSArray *list3 = [[NSMutableArray alloc] initWithObjects:@"24242", @"24242", @"24242", @"4242", @"4242", @"24242", nil];

    self.array1 = list1;
    self.array2 = list2;
    self.array3 = list3;

    [list1 release];
    [list2 release];
    [list3 release];
}

#pragma mark -
#pragma mark - TableView Data Source Methods

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    switch (section) {
        case 0:
            return [array1 count];
            break;
        case 1:
            return [array2 count];
            break;
        case 2:
            return [array3 count];
            break;
        default:
            break;
    }
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cells = @"Cells";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cells];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cells];
    }
    switch (indexPath.section) {
        case 0:
            cell.textLabel.text = [array1 objectAtIndex:indexPath.row];
            break;
        case 1:
            cell.textLabel.text = [array2 objectAtIndex:indexPath.row];
            break;
        case 2:
            cell.textLabel.text = [array3 objectAtIndex:indexPath.row];
            break;
        default:
            break;
    }
    return cell;

}

崩溃日志如下:

2012-06-25 23:33:37.694 X-Factor[617:f803] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SettingsViewController 0x6c912a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key tableView.'
*** First throw call stack:
(0x13cd022 0x155ecd6 0x13ccee1 0x9c5022 0x936f6b 0x936edb 0x951d50 0x23971a 0x13cedea 0x13387f1 0x23826e 0xde1fc 0xde779 0xde99b 0xfa0a9 0xf9edd 0xf84aa 0xf834f 0xf9e14 0x13cee99 0x1a14e 0x1a0e6 0x2424bd 0x13cee99 0x1a14e 0x1a0e6 0xc0ade 0xc0fa7 0xc0b13 0x244c48 0x13cee99 0x1a14e 0x1a0e6 0xc0ade 0xc0fa7 0xc0266 0x3f3c0 0x3f5e6 0x25dc4 0x19634 0x12b7ef5 0x13a1195 0x1305ff2 0x13048da 0x1303d84 0x1303c9b 0x12b67d8 0x12b688a 0x17626 0x21c2 0x2135)
terminate called throwing an exception(lldb) 
4

3 回答 3

0

这可能是一个时间问题——当需要填充表视图时,数据还没有准备好被读取。尝试在 initWithNibName (self.array1,self.array2 & self.array3) 中删除 NSMutableArrays,并在 viewWillAppear 而不是 viewDidLoad 中准备数据。另外,当提到保留属性时(我假设 self.array1 等被定义为保留?) - 使用self .array1

于 2012-06-25T15:03:21.053 回答
0

这不会解决您的崩溃问题,但除非您在break;后面添加以下内容,否则您将遇到其他问题:

case 1:
    cell.textLabel.text = [array2 objectAtIndex:indexPath.row];
于 2012-06-25T15:07:58.030 回答
0

几点:

a) 我建议您使用 ARC 而不是手动内存管理(Apple 也是如此)。ARC 是 Objective-C 的未来,你越早开始考虑对象图而不是保留/释放越好。

b)不要在您的初始化代码中使用属性,而是使用 ivars(代码假设您综合为您的 ivars 的下划线)

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    _title = @"Settings";
    _tabBarItem.image = [UIImage imageNamed:@"19-gear.png"];
}
return self;

c) 您需要返回 tableview (3) 中的节数,而不是您输入的 2

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

d) 您的 tableView:numberOfRowsInSection 方法不一致。在每个 switch 语句中放置一个 break 语句。IE:

switch (section) {
    case 0:
        return [array1 count];
        break;
    case 1:
        return [array2 count];
        break;
    case 2:
        return [array3 count];
        break;
    default:
        break;
}
return 0;
于 2012-06-25T15:32:20.833 回答