Как создать переход на раскадровке от программно зарегистрированного UICollectionViewCell к новому UIViewController?

Я использую Storyboard в Xcode 5.1.1, и у меня есть UICollectionView. Однако ячейки на самом деле используют XIB (поэтому не отображаются в раскадровке), который затем программно регистрируется в UICollectionView, например:

UINib *nibHero = [UINib nibWithNibName:@"MTNNewsListHeroCell"
                            bundle:[NSBundle mainBundle]];    

[self.newsListCollectionView registerNib:nibHero
              forCellWithReuseIdentifier:@"heroCellID"];

Все идет нормально. Все работает нормально.

Затем я хотел бы создать переход от этого UICollectionViewCell к другому UIViewController на раскадровке. Это довольно стандартная функция «щелкните элемент, чтобы открыть подробный вид».

Обычно, если ячейка существует в раскадровке внутри UICollectionView, я могу нарисовать линию на раскадровке от нее до следующего UIViewController, чтобы создать переход. Однако ячейка не существует в раскадровке (опять же, потому что ячейки сделаны в виде файла XIB):

Как сделать переход от Cell к следующему UIViewController?

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

Можно ли отобразить и создать переход на раскадровке от программно зарегистрированного UICollectionViewCell (созданного внутри UICollectionView, который в моем примере является подпредставлением контроллера представления списка новостей) к новому UIViewController ( Отдельная новость в моем примере), и действительно ли это соединение отображается в раскадровке?

Последнее обновление:

Это то, что я сделал, следуя предложению пользователя @rdelmar. Я думаю, что это делает работу хорошо:

Фиктивный переход с желтыми нотами


person hfz    schedule 20.06.2014    source источник
comment
Вы можете добавить переход от viewController(NewListViewController) к другому viewController(SingleNewsViewController) , указать для него идентификатор и вызвать executeSegueWithIdentifier: когда выбрана ячейка.   -  person Yatheesha    schedule 20.06.2014


Ответы (2)


Нет, ты не можешь этого сделать. Переход — это, по сути, визуальное представление перехода от одного контроллера представления к другому. Вам нужно, чтобы оба конца этого перехода были визуально представлены на раскадровке, чтобы сделать один. Вы можете добавить ячейку в представление коллекции и подключить к ней переход только для того, чтобы показать поток в раскадровке, но она никогда не будет вызываться, потому что ячейка, которую вы фактически имеете в представлении коллекции, будет создана из файла xib (я я не уверен, что это прояснит ситуацию для тех, кто смотрит на ваш код). Если вы действительно хотите реально функционирующий переход, вместо этого создайте ячейку в раскадровке.

person rdelmar    schedule 20.06.2014
comment
Ваш ответ имеет смысл для меня. Я думаю, что идея добавить ячейку в представление коллекции и подключить к ней переход, просто чтобы показать поток, является хорошей для моей цели. Затем я просто добавлю текст в новый контроллер представления, объясняющий, что все это просто пустышка. - person hfz; 20.06.2014
comment
@hfz Я думаю, очень приятно, что вы заботитесь об этом, большинство разработчиков просто проигнорируют подобные проблемы. Читабельность и понятность — это то, чему следует придавать большее значение! :) - person nburk; 20.06.2014

Может быть обходной путь, если кому-то это понадобится позже.

В представлении коллекции или контроллере представления коллекции:

private var onSelectionChangeListener:(()->Void)? = nil;

override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
    if onSelectionChangeListener != nil {               
        onSelectionChangeListener!();
    }

    return true;
}

func setSelectionChangeListener(listenerMethod:(()->Void)) {
   onSelectionChangeListener = listenerMethod;
}

Таким образом, ваш вид коллекции может понять, что был сделан выбор. Вы можете двигаться дальше отсюда. Внутри вашего пользовательского listenerMethod вы можете вызывать segue вместо внутри ячейки.

Вам может понадобиться изменить сигнатуру метода (вместо ()-Void), чтобы узнать, с какой ячейкой произошло взаимодействие.

person JSBach    schedule 10.09.2016