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

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

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

или:

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

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

Ответ 1

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

Ответ 2

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

NSString *restorationId = self.restorationIdentifier;

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

Ответ 3

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

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

Зачем вам это нужно?

Ответ 4

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

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

Это точно даст вам Storyboard Id, который вы установили через конструктор интерфейса.

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

extension UIViewController {
    var storyboardId: String { 
        return value(forKey: "storyboardIdentifier") as? String
    }
}

Ответ 5

Самый надежный метод для возврата "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, вы также можете добавить заголовок.

Ответ 6

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

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