NSIndexPath, связанный с UITableView

У меня есть табличное представление в моем основном представлении и текстовое поле в моем подробном представлении. Приложение простое. Добавьте ячейку табличного представления с некоторой информацией. Затем, если вы нажмете на ячейку, она подтолкнет подробный вид и отобразит ячейку title/text в текстовом поле. В главном представлении я использую NSFetchedResultsController. И во втором представлении я пытаюсь загрузить данные, но по какой-то причине я неправильно использую свою собственную переменную indexPath, потому что каждая нажатая ячейка показывает первые ячейки text в подробном представлении. Код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
[self configureCell:cell atIndexPath:indexPath];
self.path = indexPath;
    //I have tried this as well.
    //self.path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
return cell;
}

Подробный вид:

-(void)viewWillAppear:(BOOL)animated
{
if (self.context == nil)

{

    self.context = [(FBCDAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

}

NSFetchRequest *request = [[NSFetchRequest alloc]init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" inManagedObjectContext:self.context];

[request setEntity:entity];

NSError *error;

NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];

[self setTableArray:array];

FailedBankInfo *infoData = [self.tableArray objectAtIndex:self.root.path.row];

NSString *string = [NSString stringWithFormat:@"%@", infoData.name];

self.nameField.text = string;

string = [NSString stringWithFormat:@"%@", infoData.city];

self.cityField.text = string;

string = [NSString stringWithFormat:@"%@", infoData.state];

self.stateField.text = string;

[super viewWillAppear:YES];

}

person Bad_APPZ    schedule 09.12.2012    source источник


Ответы (1)


Почему бы просто не передать путь индекса в контроллер подробного представления в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

метод с пользовательским инициализатором:

- (id)initDetailViewControllerWithIndexPath:(NSIndexPath*)indexPath

?

Я не знаком с корневым свойством UIViewController, что это такое? Кажется, это попытка сослаться на первый контроллер представления из контроллера подробного представления. Вы проверили, что возвращает self.root.path.row?

В любом случае свойство пути вашего первого контроллера представления не зависит от того, какая ячейка выбрана так, как у вас есть код. Он просто устанавливается на indexPath последней загруженной ячейки. Если вы хотите каким-то образом получить доступ к этому свойству из вашего контроллера подробного представления, его нужно будет установить в методе didSelectRowAtIndexPath, а не в методе cellForRowAtIndexPath, чтобы быть точным.


Я думаю, что если вы установите путь в didSelectRowAtIndexPath, ваш способ должен работать. Но чтобы написать пользовательский инициализатор, добавьте свойство в контроллер подробного представления с именем path, а затем добавьте пользовательский инициализатор в контроллер подробного представления следующим образом:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andIndexPath:(NSIndexPath*)indexPath
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.path = indexPath;
    }
    return self;
}

и вызовите это из метода didSelectRowAtIndexPath первого контроллера представления, используя

DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle] andIndexPath:indexPath];
[self presentViewController:detailViewController animated:YES completion:nil]; 

(если вы не инициализируете из xib, настройте тот инициализатор, который вы используете).

Или вместо передачи индексного пути вы можете передать NSDictionary, содержащий данные, которые вам нужны в контроллере подробного представления (заголовок и текст).

person Darren    schedule 09.12.2012
comment
Спасибо за ответ. pass indexPath в подробном представлении, как я могу это сделать? Я также пробовал self.path = [tableView indexPathForSelectedRow]; в методе didSelectRow.... Да, root — это первый контроллер представления. И да, я NSLog отредактировал self.root.path.row, и он возвращает 0 независимо от того, какая ячейка нажата. Хорошо, это имеет большой смысл. Я попробую установить переменную self.path в методе didSelectRowAtIndexPath. Еще раз спасибо! - person Bad_APPZ; 11.12.2012
comment
+1, и я хотел бы использовать метод NSDictionary, однако я использую основные данные и NSFetchedResultsController. Но по какой-то причине этот проклятый indexPath настаивает на том, чтобы каждый раз возвращать 0. Есть ли другой способ передачи indexPath между представлениями? (Будет ли это проблемой?) Или это способ его инициализации? Благодарю вас! - person Bad_APPZ; 11.12.2012