cellForRowAtIndexPath возвращает ноль, но на самом деле нужен подобный метод - PullRequest
1 голос
/ 15 марта 2012

У меня есть UITableView в моем UITableViewController (смеется, очевидно), но мне нужно получить ячейку с заданным индексом в методе - (void)viewWillAppear:(BOOL)animated.

Теперь мои ячейки статичны иЯ создаю их в конструкторе интерфейсов.Если я звоню

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

, для ячейки возвращается ноль.У меня только 3 статические ячейки в 1 секции.Я пробовал оба раздела 0 и 1 и оба возвращали ноль.

В настоящее время я удалил метод - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath, потому что, если я добавлю его, он очистит UITableView от всех моих статических ячеек.

Есть ли метод, который я могу вызвать в - (void)viewWillAppear:(BOOL)animated, который будет возвращать ячейку с данным индексом?

Заранее спасибо!

РЕДАКТИРОВАТЬ: я проверил этот вопрос переполнения стека но я использую статические ячейки без 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

Ответы [ 2 ]

8 голосов
/ 15 марта 2012

У меня есть проект, который делает именно это, и он работает отлично.Однако не не будет работать, если вы не вызовете [super viewWillAppear:animated], прежде чем попытаетесь получить доступ к ячейкам таким образом.

Базовая реализация предположительно загружается в ячейки из раскадровки.

0 голосов
/ 15 марта 2012

Я хочу добавить аксессуар с галочкой в ​​ранее выбранную ячейку, переменная ранее_с выбранная ячейка будет сохранена, даже если приложение закроется / выйдет из строя

Для этого нужно управлять indexPathв вашей реализации cellForRowAtIndexPath и действуйте, если оно равно ранее_выбранное_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
    }
}
...