Раскадровка Segue від контролера подання до себе


76

Я намагаюся створити механізм детального перегляду списку файлів / папок. Ідея полягає в тому, щоб показувати один і той же контролер перегляду списку файлів кожного разу, коли користувач вибирає папку, і показувати контролер перегляду деталей файлу, якщо він / вона вибирає файл.

Наразі я створив сегмент від контролера перегляду списку файлів до контролера перегляду деталей файлу та сегмент від комірки подання таблиці списку файлів до контролера подання таблиці списку файлів:

введіть тут опис зображення

Проблема в тому, що як тільки користувач натискає клітинку, програма виконується. Я хотів би видалити сегмент з комірки подання таблиці і зробити його одним із контролера перегляду списку файлів. Таким чином, я міг би програмувати правильний сегмент програмно, коли користувач натискав на клітинку.

Отже, моє запитання: чи можна створити програму від контролера перегляду до себе в Interface Builder?


1
Так, за допомогою xcode 5 ви можете. див. пост .
Джон Хенкель,

Відкрийте меню "Редактор", клацніть Show Document Outline, а потім просто перетягніть правою кнопкою миші з комірки до ViewControllerоб'єкта " Список файлів структури" .
DawnSong

Відповіді:


26

Я розробив метод створення фільму за допомогою фантомної кнопки. Я вірю, що це вирішить вашу проблему. Ви можете прочитати про це у моїй відповіді тут .


4
Це поставило мене на правильний шлях. Я додав кнопку на "Dock" і підключив її до контролера перегляду списку файлів. Тепер я можу виконувати програму програмно як завгодно. Дякую!
Хорхе

1
Я хотів би, щоб це було не потрібно лише для того, щоб отримати самосегу, але це працює.
jogloran

2
Рішення Мустафи є менш шаленим і досить простим. Здійснення сегментів до однакових поглядів за допомогою фантомних кнопок лише зробить ваш раскадровки безладним.
strada

43

Якщо ви використовуєте навігаційний контролер, вам потрібно всунути ViewController у стек навігації. У цьому прикладі я назвав свій ViewController "VDI" в налаштуваннях мого ID розкадрування.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

Якщо ви не хочете, щоб NavigationController продовжував додавати себе до вашої історії "Назад", ви можете створити стек перед тим, як додати до нього так.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];

І цей, і методи @ TJ / @ Jorge будуть працювати. Я пішов цим шляхом, тому що він чистіший. Переваги, які я бачу в іншому методі, полягають у тому, що ви можете бачити свої циклічні сегменти в раскадровці, і що ви можете обробляти всю свою навігацію в "pripravкуForSegue:"
siburb

1
Працювали чудово! Крім того, це "ID розкадрування" в XCode, який він встановив на "VDI", для тих, хто хоче відтворити це.
Nerrolken

31

Використання Xcode 5 є набагато простішим рішенням.

  1. Клацніть на комірку таблиці на розкадруванні
  2. Відкрийте Інспектор з’єднань (піктограма зі стрілкою вправо у верхньому правому куті)
  3. У розділі "ініційовані сегменти" ви бачите "вибір"
  4. Перетягніть із кола поруч із «виділенням» до комірки на розкадруванні

Це воно.


2
Цей підхід працює як шарм без рядка коду.
Джон Сміт

2
Це правильна відповідь на Xcode 5+ і в ці дні ви повинні використовувати «шоу» SEGUE для цього.
CupawnTee

2
Здається, це не працює для мене, контролер перегляду не стає «блакитним», щоб дозволити додавати сегмент.
db0

24

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


Мені більше подобається рішення фантомної кнопки, щоб усі мої переходи вперед проходити через prepaForSegue: замість того, щоб пам’ятати, чи створений перехід у IB або коді.
Steve Moser

19

Підхід до побудови інтерфейсу: просто перейдіть до посилання на розкадрування, яке посилається на контролер подання подання.


2
Такий підхід є найкращим, якщо інша навігація здійснюється із сегами в IB! Дякую!
Роланд Т.

Безперечно, це має бути прийнятою відповіддю, оскільки тепер доступні посилання на розкадровки (чого не було, коли оператор задає питання)
Крістоф Блін,

Я виявив, що це найелегантніше рішення зараз, коли воно доступне
ZShock

4
Додаткові подробиці: вам потрібно надати контролеру ідентифікатор раскадровки, а потім використовувати цей ідентифікатор у полі Referenced ID посилання.
Джон Дж. Камілєрі

17

Правильна відповідь - використовувати посилання на Storyboard, яке посилається на контролер UIViewController, який ви хочете передати собі, а потім вкажіть на нього.

введіть тут опис зображення


12

В IOS 6 є більш чисте рішення, ніж використання фантомної кнопки. Ви все ще можете визначити сегмент із комірки таблиці до контролера перегляду та подивитися на відправника, щоб скасувати автоматично запущений сегмент:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}

4

Ось як ви можете натиснути інший екземпляр поточного контролера перегляду, не визначаючи segue або жорстко кодуючи власний ідентифікатор:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

Вам просто потрібно встановити ідентифікатор відновлення таким самим, як і ID розкадрування (для цього в IB є прапорець).

Ідентифікатор відновлення


0

Сподіваюся, це допомагає.

Я виявив, що ви можете створити кілька прототипів комірок.

Потім ви можете зв’язати кожну клітинку (в розкадруванні) з іншим видом.

Щось на зразок цього:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.