Передайте NSIndexPath между UITableViews - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть UITableView, показывающий данные из файла plist.Для этого табличного представления я просто сделал NSArray из содержимого файла plist и поместил данные в каждую ячейку.Но когда ячейка связана, мне нужно, чтобы следующий контроллер табличного представления знал путь индекса ячейки, к которой был подключен, чтобы этот контроллер представления знал, для какого элемента массива показывать детали.Я попробовал следующий метод:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    staffDetailView = [[StaffDetailViewController alloc] init];
    [staffDetailView setSelectedIndexPath:indexPath];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Выше я пытаюсь передать индексный путь повернутой ячейки в NSIndexPath объект, который я создал в новом контроллере представления.

Следующий заголовочный файл контроллера табличного представления:

@interface StaffDetailViewController : UITableViewController {

    NSIndexPath *selectedIndexPath;
    NSArray *staffArray;

}

@property (nonatomic, retain) NSIndexPath *selectedIndexPath;
@property (nonatomic, strong) NSArray *staffArray;

Здесь я определяю объект selectedIndexPath, который был установлен в предыдущем контроллере представления.

Но когда я пытаюсьдоступ к объекту selectedIndexPath для отображения соответствующих данных, объект выглядит как nil:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *header;
    if (section == 0) {
        NSString *name = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Staff Member"];
        NSArray *splitStaffArray = [name componentsSeparatedByString:@", "];
        NSString *lastName = [splitStaffArray objectAtIndex:0];
        NSString *firstName = [splitStaffArray objectAtIndex:1];
        NSString *consolidatedName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
        NSString *assignment = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Assignment"];
        header = [NSString stringWithFormat:@"%@\n%@", consolidatedName, assignment];
        return header;
    }
    return nil;
}

Я неправильно обращаюсь к объекту selectedIndexPath?Есть ли лучший способ для передачи правильного пути индекса к следующему контроллеру представления?

Ответы [ 2 ]

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

Я пересмотрел метод didSelectRowAtIndexPath первого контроллера представления таблицы:

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

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

Казалось, по какой-то причине мне нужно было выполнить переход, прежде чем получить доступ к переменным экземпляра контроллера этого представления. Странно, что я не мог просто alloc init контроллер представления сам. В любом случае, путь индекса теперь корректно проталкивается через контроллеры представления.

0 голосов
/ 21 февраля 2012
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //I ll use NSUserDefaults to store tha indexpath. Indexpath.row is an int property, so convert to NSNumber 

    NSNumber *ip = [NSNumber numberWithInt:indexpath.row];
    NSUserDefaults *saveIP=[NSUserDefaults standartuserdefaults];
    [saveIP setObject: ip foKey:@"theIndexPath"];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

Я другой контроллер представления извлекаю сохраненный объект (данные) с кодом ниже

NSNumber *theIndexpath= [[NSUserDefaults standartuserdefaults] objectForKey:@"theIndexPath"];

Примечание: NSUserDefaults может не быть хорошей идеей, но это было очень легко, и все еще работает для моего приложения

...