2016-10-04 1 views
1

для моего приложения мне нужно нажать один и тот же TableViewController более одного раза. Когда пользователь вводит команду didSelect, мне нужно нажать тот же контроллер в стеке навигации.Нажатие одного TableViewController в стек навигации несколько раз

Мое приложение - это приложение для файлового менеджера, и оно подключается к ftp-серверу и показывает пользователю то, что внутри. Но могут быть папки внутри папок, которые содержат больше папок (бесконечно).

Для этого я не могу создать много TableViewControllers в раскадровке и когда я пытаюсь нажать тот же контроллер в панель навигации с этим:

navigationController?.pushViewController(self, animated: true) 

я получаю ошибку говорит, что я не могу нажать тот же контроллер в nav stack. Так я создать новый экземпляр моего контроллера и попытаться подтолкнуть, как это:

let newMyTableVC = MyTableVC() navigationController?.pushViewController(newMyTableVC, animated: true)

Но с этим я также получаю ошибку говорит, что:

«не удалось из очереди клетки с идентификатором FolderCell - должен зарегистрировать нить или класс для идентификатора или подключить прототип ячейки в раскадровке.

Итак, что я понимаю из-за этой ошибки, которую использует мой первый TableViewController s мой идентификатор ячеек, и он находится в памяти. Когда я пытаюсь передать новый экземпляр моего TableViewController с тем же идентификатором ячейки, он выходит из строя, потому что ячейка уже существует с тем же идентификатором. (Возможно, я ошибаюсь).

If i am on right track doing this with approach at the above { 
    How do i reuse cells with dynamic identifier and provide data to them. 
} else { 
    How do i accomplish what i want? 
    } 

Благодарим за ваше время.

+0

Зачем создавать новый контроллер каждый раз, а не просто изменить набор данных, совпадающий ток каталог? Затем используйте функцию reloadData() TableView? – Guardanis

+1

Его отличный подход. Дайте контроллеру табличного представления идентификатор раскадровки и создайте экземпляр self.storyboard instantiateViewControllerWithId. – danh

+0

привет, ребята, спасибо за ответ. Мне нужно каждый раз создавать новый контроллер, потому что я хочу, чтобы пользователь мог вернуться из последнего контроллера представления папок в кеш, не дожидаясь нового сетевого запроса и перезагрузки tableView. Кроме того, это плохой пользовательский опыт, когда пользователь отбирает ячейку, и вы перезагружаете данные, а не нажимаете новый контроллер просмотра в стек навигации. –

ответ

1

При создании нового экземпляра, как это:

let newMyTableVC = MyTableVC() 

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

Чтобы избежать этой проблемы, установите идентификатор для контроллера представления таблицы в раскадровке, а затем использовать:

let newMyTableVC = self.storyboard!.instantiateViewControllerWithIdentifier("identifier") as! MyTableVC 
+0

Спасибо за ваш ответ, он отлично работает. Я никогда не думал об этом, даже я использовал этот метод много раз. Так это подход, который я должен использовать всякий раз, когда мне нужен экземпляр контроллера вида в раскадровке? –

+1

@ YasinNazlıcan Да, если вы хотите использовать дизайн и макет из раскадровки, вы должны либо использовать instantiateViewControllerWithIdentifier, либо использовать segue. – pbasdf

Смежные вопросы