повторное использование одного и того же UITableViewController

У меня есть tableviewcontroller, который должен развернуть и показать 3 уровня данных. У меня нет проблем с детализацией, но когда я возвращаюсь, ячейки и таблица становятся пустыми. В настоящее время я использую раскадровку, и у меня не было этой проблемы, когда я использовал перо. Все, что мне нужно было сделать, это выделить и initWithNibName одно и то же представление, и это создаст еще один экземпляр того же TableView, и я смогу вернуться, и все данные будут там.

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

- (void)drillDown{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    ExerciseTableViewController *tableView = [storyboard instantiateViewControllerWithIdentifier:@"ExerciseTableView"];
    tableView.title = _detailTitle;
    tableView.delegate = self;
    tableView.level = _level;
    tableView.currentSMID = _currentSMID;
    tableView.currentMID = _currentMID;
    tableView.muscleNameArray = _muscleNameArray;
    if (_level == 2) {
        tableView.submuscleNameArray = _submuscleNameArray;
    }
    [self.navigationController pushViewController:tableView animated:YES];
}

Это то, что у меня есть на мой взглядDidLoad

- (void)viewDidLoad {

[super viewDidLoad];



UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addExercise:)];
self.navigationItem.rightBarButtonItem = add;

NSLog(@"level: %i, currentSMID: %i, currentMID: %i", _level, _currentSMID, _currentMID);

if (self.managedObjectContext_ == nil) {
    self.managedObjectContext_ = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

if (_level == 1) {
    _submuscleNameArray = [self submuscleGroup:_currentMID valueForKeyPath:@"submuscleGroup"];
    _submuscleIDArray = [self submuscleGroup:_currentMID valueForKeyPath:@"submuscleID"];
} else if (_level == 2) {
    //loading and sorting exercise list
    _exerciseList = [self loadExercise:_currentMID sub:_currentSMID];
    _exerciseListSorted = [self sortKeysByName];
} else {
    [self loadMuscleGroup];
}

}

Представление таблицы заполняется только тогда, когда я помещаю часть этого кода в viewDidAppear, но я не могу различить детализацию и возврат с помощью viewDidAppear.

Разве навигационный контроллер не должен сохранять мой текущий вид и нажимать новый вид, и когда я открываю новый вид, я возвращаюсь к своему текущему виду?

Кажется, что каждый раз, когда я открываю представление, предыдущее представление должно загружаться снова, и это приводит к тому, что мои предыдущие представления становятся пустыми.

Какие-либо предложения?

Раскадровка прикреплена Storyboard


person jon_na_fun    schedule 26.04.2015    source источник
comment
Так и должно быть, поэтому я бы предположил, что на самом деле вы не выскакиваете - вы, вероятно, случайно создаете совершенно новый экземпляр этого контроллера представления. - Также имейте в виду, что viewDidLoad вызывается только один раз в жизни контроллера представления, поэтому, если вы видите, что он вызывается при выталкивании, вы не выталкиваете. viewDidAppear, с другой стороны, вызывается при создании и при извлечении.   -  person matt    schedule 26.04.2015
comment
но я не могу различить детализацию и возврат с помощью viewDidAppear. На самом деле это не так. Если это то, что вам нужно сделать, чтобы это сработало, вам нужно спросить об этом.   -  person matt    schedule 26.04.2015
comment
Можете ли вы сказать мне, создал ли я экземпляр нового представления с помощью метода DrillDown, описанного выше? У меня никогда не было этой проблемы с использованием файлов пера, но раскадровка сводит меня с ума.   -  person jon_na_fun    schedule 26.04.2015
comment
Давайте сосредоточимся на этой строке вашего вопроса: но она не работает, так как мне нужно, чтобы tableviewcontroller возвращался к себе, если я углубляюсь. Что вы делаете, так это то, что у вас есть два экземпляра одного и того же класса в раскадровка. У вас есть переход от первого ко второму, а чтобы вернуться (вытолкнуть), если вы не хотите просто использовать встроенную кнопку «Назад», вы используете переход отката. Я беспокоюсь о том, как сейчас настроена раскадровка по отношению к вашему коду...   -  person matt    schedule 26.04.2015
comment
Я добавил изображение моей раскадровки. Разве navigationviewcontroller не заботится о всплывающих окнах автоматически? В чем разница между popping и unwind segue? Я пробовал иметь 3 экземпляра табличного представления (3 уровня детализации), и все они ссылались на один и тот же класс с использованием перехода, но это тоже не сработало. viewDidLoad вызывается только один раз, но я подозреваю, что я могу создать новый экземпляр контроллера представления или, когда он появляется, он удаляет все мои данные и приводит к тому, что предыдущие представления становятся пустыми.   -  person jon_na_fun    schedule 26.04.2015
comment
Насколько это изображение может показать, раскадровка выглядит нормально. Вы говорите, что viewDidLoad вызывается только один раз для контроллера упражнений? Если это так, то должно происходить что-то еще; как вы говорите, на него не следует влиять, просто нажимая на него и возвращаясь к нему.   -  person matt    schedule 26.04.2015


Ответы (1)


Так я понял в чем дело. У меня есть переменная с именем _level, и я использую ее, чтобы отслеживать, на каком уровне детализации я нахожусь. При передаче этой переменной на следующий уровень я заменил текущий уровень номером следующего уровня, поэтому, когда я возвращаюсь к предыдущий вид. Текущий уровень такой же, как и следующий уровень, который все испортил.

Я решил это, создав новую переменную с именем nextLevel и передав ее вместо этого.

Очень основная ошибка с моей стороны.

person jon_na_fun    schedule 26.04.2015