【问题标题】:cellForRowAtIndexPath returns null but really need similar methodcellForRowAtIndexPath 返回 null 但确实需要类似的方法
【发布时间】:2012-03-15 09:54:46
【问题描述】:

我的UITableViewController 中有一个UITableView(很明显,哈哈),但我需要在- (void)viewWillAppear:(BOOL)animated 方法内的给定索引处获取一个单元格。

现在,我的单元格是静态的,我在界面构建器中创建它们。如果我打电话给

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:previously_selected_cell.integerValue inSection:0]];

它为单元格返回 null。我在 1 个部分中只有 3 个静态单元格。我尝试了第 0 节和第 1 节,都返回 null。

目前我已经删除了- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法,因为如果我添加它,它将清除我所有静态单元格的UITableView

我可以在- (void)viewWillAppear:(BOOL)animated 中调用一个方法来返回给定索引处的单元格吗?

提前致谢!

编辑:我检查了this stackoverflow question,但我使用的是没有 cellForRowAtIndexPath 的静态单元格,所以这个问题没有帮助。 :(

EDIT2:我正在尝试在视图加载时设置单元格的附件类型。但仅限于某个单元格,该单元格是用户在退出应用之前选择的那个单元格。

#import "AutoSyncSettings.h"
#import "CDFetchController.h"


@implementation AutoSyncSettings

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    CDFetchController *cdfc = [[CDFetchController alloc] init];
    NSFetchedResultsController *results = [cdfc getFetchedResultsControllerWithEntityName:@"SETTINGS"];
    NSArray *objects = [results fetchedObjects];
    NSNumber *sync_setting;

    if(objects.count > 0)
    {     
        NSManagedObject *object = [objects objectAtIndex:0];
        sync_setting = [object valueForKey:@"wifi_setting"];

        NSLog(@"(Settings)sync_setting: %@",sync_setting);
    NSLog(@"(Settings)sync_setting int value: %i",sync_setting.integerValue);
    NSLog(@"(Settings)TableView: %@",self.tableView);

//cell is null, even after this.
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:wifi_settings.integerValue inSection:0]];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
//cell is still null. WHY OH WHY? :(

        objects = nil;
    }

    cdfc = nil;
    results = nil;
    objects = nil;
    sync_setting = nil;

    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    for (int i = 0; i < [tableView numberOfRowsInSection:indexPath.section]; i++)
    {
        if([[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:indexPath.section]] accessoryType] == UITableViewCellAccessoryCheckmark)
        {
            [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:indexPath.section]].accessoryType = UITableViewCellAccessoryNone;
        }
    }

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    CDFetchController *cdfc = [[CDFetchController alloc] init];
    NSFetchedResultsController *results = [cdfc getFetchedResultsControllerWithEntityName:@"SETTINGS"];
    NSManagedObjectContext *context = [results managedObjectContext];
    NSArray *objects = [results fetchedObjects];

    if(objects.count > 0)
    {

        NSManagedObject *object = [objects objectAtIndex:0];

        NSNumber *sync_setting = [NSNumber numberWithInt:indexPath.row];
        [object setValue:sync_setting forKey:@"sync_interval"];
        [object setValue:[NSNumber numberWithInt:0] forKey:@"id"];

        [ErrorHandler saveMoc:context];
    }
    else
    {
        //INSERT NEW OBJECT
        NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"SETTINGS" inManagedObjectContext:context];

        NSNumber *sync_setting = [NSNumber numberWithInt:indexPath.row];
        [object setValue:sync_setting forKey:@"sync_interval"];
        [object setValue:[NSNumber numberWithInt:0] forKey:@"id"];

        [ErrorHandler saveMoc:context];
    }
}

@end

【问题讨论】:

  • 我相信cellForRowAtIndexPath 应该仍然有效;你确定previously_selected_cell.integerValue 有你期望的值吗?
  • @jtbandes 是的,目前是 2 个。如果在 cellForRowAtIndexPath 中添加注释,我所有的静态单元格都会消失。我相信它会尝试创造新的细胞......
  • 您到底想实现什么 - 为什么要在 viewWillAppear 方法中获取该索引处的单元格?
  • @NickBull 抱歉,将编辑我的问题。我想为先前选择的单元格添加一个复选标记附件,即使应用程序退出/崩溃,previously_selected_cell 变量也会被存储
  • 当您被请求与先前设置的索引路径匹配的索引路径时,为什么不在您的 tableview 委托中的 cellForRowAtIndexPath 实现中设置它?

标签: objective-c uitableview delegates interface-builder


【解决方案1】:

我有一个项目正是这样做的,而且效果很好。但是,除非您在尝试以这种方式访问​​单元格之前调用 [super viewWillAppear:animated],否则它不起作用

基本实现可能会从情节提要加载到单元格中。

【讨论】:

  • viewWillAppear 会自动加载正常,但这不是我的问题。无论如何感谢您的发布。
  • 是的,对不起- (void)viewWillAppear:(BOOL)animated。在那种方法中,我想要获取单元格。 - (void)viewDidLoad 也可以。
  • 我将发布我的整个课程。我更改了一些变量名,除此之外,一切都是我发布 OP 时的样子。
  • 哦,看的时候没看懂。将在此处修复并通知您。
  • 似乎确实如此。修复。感谢您的耐心和持续的帮助!
【解决方案2】:

我想在之前选择的单元格中添加一个复选标记附件, 即使应用程序,previous_selected_cell 变量也会被存储 退出/崩溃

要走的路是控制你的 cellForRowAtIndexPath 实现中的 indexPath 并在它等于 previous_selected_cell.integerValue 时采取行动:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    // usual cache lookup, allocation of the cell, etc
    if (indexPath.row == previously_selected_cell.integerValue) {
        // add checkbox here
    } else {
        // remove checkbox
    }
}

【讨论】:

  • 如果你使用的是静态表视图,你不能实现这个方法。
  • @jrturton 没错。我想按照 MrTJ 发布的方式使用它,但我的 UITableView 不是动态的。@ MrTJ 谢谢你的方法。
  • 对不起各位,我没有很好地阅读这个问题。不幸的是静态 UITableViews 我没有相关经验,也许其他人会想出一个解决方案。编辑 - 我看到它已经解决了:)
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2011-03-08
相关资源
最近更新 更多