Раскадровка 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.