Программно получить идентификатор раскадровки?

Попытка узнать, может ли UIViewController или UIView идентифицировать свой идентификатор раскадровки. Так надеялся на:

UIViewController *aViewController;
NSString *storyboardID = aViewController.storyboard.id;  //not an actual property

or:

NSString *storyboardID = [aViewController.storyboard valueForKey:@"storyboardId"];  //also not a working call

Но без радости и не смог найти аналогичное решение в Интернете. Кто-нибудь знает, возможно ли это вообще?


person Jalakoo    schedule 04.12.2012    source источник
comment
Просто интересно, вы можете использовать '[aViewController.storyboard valueForKey:@name];'. Хотя другие ответы лучше.   -  person Sam Clewlow    schedule 13.05.2015
comment
@Энди, где раскадровка?   -  person ArgaPK    schedule 02.01.2018
comment
@ArgaPK давным-давно была частная собственность под названием storyboardIdentifier. Я понятия не имею, доступен ли он еще, но вы можете попробовать запросить его с помощью valueForKey.   -  person Ben Affleck    schedule 02.01.2018


Ответы (6)


Вы можете использовать restoreIdentifier, он находится прямо над идентификатором раскадровки и является свойством UIViewController.

person Lolloz89    schedule 24.04.2013
comment
Для тех, кто создает приложения или статические библиотеки для более ранних версий iOS, свойство restoreIdentifier — iOS 6.0+. - person Jalakoo; 10.12.2014
comment
Просто установите флажок Использовать идентификатор раскадровки в построителе интерфейсов, чтобы автоматически использовать идентификатор раскадровки в качестве свойства restoreIdentifier. Он будет установлен динамически, вам не придется вводить его дважды. - person thgc; 17.12.2014
comment
Ссылка на restoreIdentifier говорит The value of this property is nil by default, which indicates that the view’s state does not need to be saved. Это означает, что установка для restoreIdentifier значения, отличного от nil, имеет какие-то побочные эффекты! - person ypresto; 25.11.2015

Вы можете использовать идентификатор восстановления:

NSString *restorationId = self.restorationIdentifier;

Просто установите флажок «Использовать идентификатор раскадровки».

person Erickson1    schedule 22.04.2014
comment
Спасибо! Работает как шарм! - person Genevios; 02.05.2015
comment
я получаю ноль - person Mihir Oza; 28.04.2017

Идентификатор раскадровки предназначен только для поиска и создания экземпляра VC из раскадровки. Как написано в справочнике UIStoryboard:

«Этот идентификатор не является свойством самого объекта контроллера представления и используется только файлом раскадровки для определения местоположения контроллера представления».

Зачем тебе это?

person LombaX    schedule 04.12.2012
comment
Изучение различных способов уникальной идентификации viewControllers и их представлений программным путем. .tag, .title, .accessibilityLabel, .nibName работают достаточно хорошо. Я считаю, что идентификаторы объектов отсутствуют (частные?), поэтому мне было интересно, были ли идентификаторы раскадровки вообще вариант. - person Jalakoo; 04.12.2012
comment
Возможно, вы можете сгенерировать идентификатор, используя имя класса контроллера - person ıɾuǝʞ; 19.08.2013
comment
Я использую более 40 контроллеров представления в проекте, и у меня нет намерения устанавливать какое-то новое значение для каждого из них только для того, чтобы их можно было найти. Идентификатор восстановления уже настроен для меня. - person vedrano; 15.07.2014
comment
Apple добавила флажок «Использовать идентификатор раскадровки» для идентификатора восстановления в построителе интерфейсов. Очевидно, они сделали это для того, чтобы нам, разработчикам, было проще использовать идентификатор раскадровки в коде. - person thgc; 17.12.2014
comment
Может использоваться один файл кода контроллера и несколько ViewController. - person Mohammad Zaid Pathan; 12.03.2016

Вы также можете попробовать сделать что-то вроде этого: -

NSString *storyboardId = [viewController valueForKey:@"storyboardIdentifier"];

Это точно даст вам идентификатор раскадровки, который вы установили с помощью построителя интерфейса.

Быстрое расширение:

extension UIViewController {
    var storyboardId: String { 
        return value(forKey: "storyboardIdentifier") as? String
    }
}
person Apple_iOS0304    schedule 15.11.2016
comment
Это было очень полезно. Как раз то, что я искал. Спасибо! - person Phontaine Judd; 10.09.2019

Самый надежный метод возврата "id" UIViewController или UIView - это...

NSString *viewControllerName = [[NSString alloc] initWithString:viewController.nibName];

Это вернет... «29w-Ic-LNo-view-FDu-oq-UpZ», где «29w-Ic-LNo» — идентификатор объекта UIViewController, а «FDu-oq-UpZ» — идентификатор объекта UIView.

Однако вы также можете использовать...

NSString *viewControllerName = [[NSString alloc] initWithString:viewController.title];

Это вернет «Название» UIViewController в инспекторе атрибутов; так же легко, как вы добавили идентификатор раскадровки в UIViewController, вы также можете добавить заголовок.

person serge-k    schedule 12.10.2014

Вы можете сравнить с именем класса. импортируйте класс, а затем попробуйте.

NSArray *viewControllers = self.navigationController.viewControllers;
UIViewController *root = [viewControllers objectAtIndex:0];
if ([root isKindOfClass:[UserLogin class]]) {
//--- do ---
}
person Deepak Kumar Sahu    schedule 20.06.2016