Master to Detail View — сброс подробного вида при возврате к основному виду

Как сбросить подробное представление в приложении с основным и подробным представлением? Например, в моем основном представлении просто перечислены имена, и когда вы выбираете имя, мне нужны сведения о человеке, которого вы выбрали. Что приложение будет делать. Однако, когда я нажимаю кнопку «Назад» в подробном представлении и выбираю другое имя, подробное представление остается с первым выбранным элементом. Как сбросить этот подробный вид, чтобы он отображал детали всего, что выбрано?

У меня есть это в моем контроллере просмотра деталей (профиль - это класс):

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString *)name details:(Profile *)profile{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Detail", @"Detail");

        NSLog(@"Details: %@", [profile lastName]);
        _detailProfile = profile;

    }
    return self;
}

И это в моем masterviewcontroller:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.detailViewController) {
        //self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil];

        _showProfile = [_profileArray objectAtIndex:indexPath.row];

        self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil title:@"Detail" details:_showProfile];
    }
    NSDate *object = _objects[indexPath.row];
    self.detailViewController.detailItem = object;
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}

ОТРЕДАКТИРОВАНО ИЗ ПОЛУЧЕННОГО ОТВЕТА

Ok. detailProfile является свойством контроллера подробного представления, и я создал метод:

@property (strong, nonatomic) Profile *detailProfile;
-(void)setDetailProfile:(Profile *)profile;

Реализовано следующим образом:

-(void)setDetailProfile:(Profile *)profile{
    NSLog(@"Going to display profile: %@, %@", [profile lastName], [profile firstName]);

    [firstName setText:[profile firstName]];
    [lastName setText:[profile lastName]];
}

Теперь по какой-то причине мои метки firstName и lastName не обновляются.

В мастере сделал следующее:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.detailViewController) {
        //self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil];

        _showProfile = [_profileArray objectAtIndex:indexPath.row];

        NSLog(@"Profile selected last name: %@", [_showProfile lastName]);

       // self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil title:@"Detail" details:_showProfile];

        self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil title:@"Detail"];

        self.detailViewController.detailProfile = _showProfile;
    }
    NSDate *object = _objects[indexPath.row];
    self.detailViewController.detailItem = object;
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}

Мои выходные данные в журнале не обновляются при выборе новых элементов — после возврата из подробного представления — и мои метки обновляются.


person CodeMoto    schedule 13.10.2012    source источник


Ответы (1)


Если detailProfile не является свойством контроллера подробного представления, сделайте его свойством. Создайте свой собственный метод setDetailProfile и в нем обновите все, что вам нужно в вашем подробном контроллере (и на экране), когда вы получите новый профиль. (Вы не говорите, где вы это делаете в настоящее время, но, вероятно, вы можете переместить код из viewWillAppear или viewDidAppear или что-то в этом роде.)

Измените свой метод инициализации, чтобы ему не требовался параметр профиля, а затем измените свой мастер на что-то вроде:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.detailViewController) {
        self.detailViewController = [[MediaDirectoryDetailViewController alloc] initWithNibName:@"MediaDirectoryDetailViewController" bundle:nil title:@"Detail"];
    }
    _showProfile = [_profileArray objectAtIndex:indexPath.row];
    self.detailViewController.detailProfile = _showProfile;

    NSDate *object = _objects[indexPath.row];
    self.detailViewController.detailItem = object;
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}

РЕДАКТИРОВАТЬ:

Для айфона. поскольку нет разделенного представления, игнорируйте часть о создании пользовательского метода setDetailProfile. Вместо этого установите свойство, как показано выше, но затем используйте self.detailProfile для обновления экрана во время viewWillAppear:.

person Phillip Mills    schedule 13.10.2012
comment
Я сделал то, что вы рекомендовали, но теперь по какой-то причине мои метки в представлении не обновляются, хотя NSLog показывает то, что должно быть там. Есть идеи? Я отредактировал свой оригинальный пост. - person CodeMoto; 14.10.2012
comment
Моя ошибка... Я в основном занимался программированием для iPad и пропустил тот факт, что вы были на iPhone. (Разница в том, что детальный контроллер отображается только один раз на iPad.) Вместо того, чтобы обновлять имена в setDetailProfile, просто сохраните информацию о профиле и выполните обновление в viewWillAppear как [firstName setText:[self.detailProfile firstName]]; и т. д. На самом деле вам даже не нужно пользовательская версия setDetailProfile. - person Phillip Mills; 14.10.2012
comment
Я очистил много вещей, и кажется, что мой - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath никогда не вызывается после возвращения из подробного представления. Я поместил вывод в журнал в этой функции, и он выводится только при первом выборе элемента в мастере. После того, как вы выберете обратно из детали и выберите другой элемент в основном списке, он никогда не выводит следующий элемент. - person CodeMoto; 14.10.2012