将UITableView
放入UITableView
中另一个UITableViewController
的静态单元格内时出现问题。如果 self.skillsTableView 的单元格数多于 self.tableView ,那么我的应用程序会因为异常而崩溃:
*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArrayI objectAtIndex:]:索引6超出边界[0 .. 5]'
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *skillsCellIdentifier = @"skill_cell";
if (tableView == self.skillsTableView) {
NSLog(@"GET DYNAMIC %li", [tableView numberOfRowsInSection:0]);
ServicesTableViewCell *cell = (ServicesTableViewCell*)[tableView dequeueReusableCellWithIdentifier:skillsCellIdentifier forIndexPath:indexPath];
Services *skill = [self.servicesArray objectAtIndex:indexPath.row];
cell.titleLabel.text = skill.title;
cell.priceLabel.text = skill.price;
return cell;
}
else {
NSLog(@"GET STATIC %li", [super tableView:tableView numberOfRowsInSection:0]);
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}
}
和
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.skillsTableView) {
NSLog(@"DYNAMIC -- %li", self.servicesArray.count);
return self.servicesArray.count;
}
else {
NSLog(@"Static == %li", [super tableView:tableView numberOfRowsInSection:section]);
return [super tableView:tableView numberOfRowsInSection:section];
}
}
输出:
2014-05-28 09:19:55.461 SesApp[32289:60b] Static == 6
2014-05-28 09:19:55.461 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.463 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.464 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.465 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.466 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.470 SesApp[32289:60b] DYNAMIC -- 0
2014-05-28 09:19:55.610 SesApp[32289:60b] Static == 6
2014-05-28 09:19:55.611 SesApp[32289:60b] DYNAMIC -- 7
2014-05-28 09:19:55.612 SesApp[32289:60b] GET STATIC 6
2014-05-28 09:19:55.613 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.617 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.619 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.621 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.623 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.625 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:19:55.627 SesApp[32289:60b] GET DYNAMIC 7
2014-05-28 09:23:08.897 SesApp[32289:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 6 beyond bounds [0 .. 5]'
答案 0 :(得分:2)
在两种委托方法中,都不应该调用super方法。你应该把实际的实现放在那里。
即
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.skillsTableView) {
return self.servicesArray.count;
}
else {
return NUMBER_OF_ROWS_FOR_PARENT_TABLE_VIEW_FOR_THIS_SECTION;
}
return 0;
}
您需要为cellForRowAtIndexPath
方法做同样的事情。
答案 1 :(得分:0)
我不知道为什么在我的情况下会发生这种情况,但如果将来会遇到同样的问题,我会以这种方式解决我的问题:
我在静态单元格中添加了UIContainerView
,UIContainerView
我有UITableViewController
这段代码:
<强> InsideTableViewController.h 强>
@protocol InsideTableDelegate
- (void)insideTableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
@end
@interface InsideTableViewController : UITableViewController
@property (nonatomic, assign) id <InsideTableDelegate> delegate;
@property (nonatomic, strong) NSNumber *count;
@end
<强> InsideTableViewController.m 强>
#import "InsideTableViewController.h"
@interface InsideTableViewController ()
@end
@implementation InsideTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.count intValue];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"InsideCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"Inside Cell %li", indexPath.row];
return cell;
}
#pragma mark - TableView Delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.delegate insideTableView:tableView didSelectRowAtIndexPath:indexPath];
}
#pragma mark - Setter
- (void)setCount:(NSNumber *)count {
_count = count;
[self.tableView reloadData];
}
@end
在我的UITableViewController
静态单元格中:
<强> CustomTableViewController.m 强>
#import "CustomTableViewController.h"
#import "InsideTableViewController.h"
@interface CustomTableViewController () <InsideTableDelegate> {
int insideCellsCount;
}
@property (weak, nonatomic) IBOutlet UIView *insideTableViewContainer;
@property (nonatomic, strong) InsideTableViewController *insideTableViewController;
@end
@implementation CustomTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
insideCellsCount = 1;
self.insideTableViewController.count = [NSNumber numberWithInt:insideCellsCount];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"InsideTable"]) {
self.insideTableViewController = [segue destinationViewController];
self.insideTableViewController.delegate = self;
}
}
#pragma mark - TableView DataSource
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.row) {
case 0:
return insideCellsCount * 44;
break;
default:
return 44;
break;
}
}
#pragma mark - TableView Delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
insideCellsCount++;
self.insideTableViewController.count = [NSNumber numberWithInt:insideCellsCount];
[tableView beginUpdates];
[tableView endUpdates];
}
#pragma mark - InsideTableView Delegate
- (void)insideTableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"INDEX: %li", indexPath.row);
}
@end
答案 2 :(得分:0)
我也面临着类似的问题。当我检查堆栈跟踪时,它说下面的方法存在问题,即抛出'NSRangeException'
tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: IndexPath)
我确实覆盖了方法以始终返回0
override func tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: IndexPath) -> Int {
return 0
}
现在正在运作。