静态单元格内的 UITableView

Posted

技术标签:

【中文标题】静态单元格内的 UITableView【英文标题】:UITableView inside static cell 【发布时间】:2014-05-27 08:05:29 【问题描述】:

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]'

【问题讨论】:

你为什么不使用 [tableView numberOfRowsInSection:section];而不是 [super] ? 在 (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 的 else 块中传递正确的计数。 @user1561414 - 因为无限循环。正确的计数并不能解决这个问题 【参考方案1】:

在这两种委托方法中,您都不应该调用超级方法。你应该把实际的实现放在那里。

- (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 方法也需要这样做。

【讨论】:

不适用于实际实现。你能告诉我如何在 cellForRowAtIndexPath 中实现静态单元格的例子吗?【参考方案2】:

我不知道为什么会发生这种情况,但是如果将来有人会遇到同样的问题,我会以这种方式解决我的问题:

我在静态单元格中添加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

【讨论】:

【参考方案3】:

我也面临类似的问题。当我检查堆栈跟踪时,它说下面的方法有问题,它正在抛出 'NSRangeException'

tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: IndexPath)

我确实重写了始终返回 0 的方法

override func tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: IndexPath) -> Int 
        return 0

现在可以了。

【讨论】:

以上是关于静态单元格内的 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

在单元格内显示整个表格视图

python读取excel某一单元格内容然后显示在网页上?

java WriteExcelFile生成excel如何让在一个单元格内换行

如何更改背景选择的颜色故事板静态单元格

excel合并单元格内容的教程

Excel单元格内容包含指定单元格内容时,如何把“指定单元格2”复制到“单元格1”后面?