2016-01-06 2 views
1

В Objective-C Я использовал имена классов, чтобы вытащить крупку из пучков или нагрузки viewControllers из раскадровки как примеры ниже:Как получить имя класса для использования для идентификатора или nibName без пространства имен?

[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil].firstObject];

[storyboard instantiateViewControllerWithIdentifier:NSStringFromClass(MyCustomViewController.class)];

Что такое эквивалентный способ стрижа, чтобы получить имя класса для использования для идентификатора или nibName без пространства имен?

Я попробовал этот

mainBundle.loadNibNamed(NSStringFromClass(MyClass.classForCoder), owner: self, options: nil)

но возвращает MyTarget.MyClass с пространством имен.

+0

Возможно, я не понимаю вас (из-за отсутствия опыта по этому вопросу), поэтому извиняюсь, если это не по теме или нет. Но в отношении вашего последнего вопроса: знаете ли вы о суффиксе экземпляра '.dynamicType'? Например, 'foo.dynamicType' является' Foobar.Type'. – dfri

+0

Почему вы используете 'classForCoder' вообще? Какова реальная проблема, которую вы пытаетесь решить? – matt

+0

@matt - обновленный вопрос, чтобы быть более простым и понятным. Не уверен, что использовать для решения этого нового вопроса. Как-то я приземлился на classForCoder. – slim

ответ

1

Трудно понять, в чем проблема, с которой вы сталкиваетесь, но проблема заключается в вашей настойчивости в прохождении методов Objective-C Cocoa, которые действительно видят название класса Swift как namespaced через модуль. Но это не похоже, большую часть выпуска:

  • Вы могли бы, я полагаю, просто механически сдирать пространство имен (он гарантированно будет все вплоть до первой точки).

  • В качестве альтернативы, вы можете пойти в обратном направлении и предоставить .xib файл или идентификатор раскадровки полное имя класса. Это хорошо работает.

Однако, по-настоящему не требуется ни одно из этих подходов. Я перевел свой первый пример:

[[NSBundle mainBundle] loadNibNamed: 
    NSStringFromClass(self.class) owner:self options:nil 
     ].firstObject]; 

... непосредственно, срок на срок, в этом:

let v = NSBundle.mainBundle().loadNibNamed(
    String(self.dynamicType), owner:self, options:nil) 
     .first 

... и она работала отлично: v в конечном итоге, как (Факультативная упаковка) вид верхнего уровня изнутри одноименного файла .xib, который, кажется, то, что вам нужно.

+0

Спасибо, что сработало хорошо – slim

0

Используйте NSStringFromClass(MyClass.self) вместо NSStringFromClass(MyClass.classForCoder) в своем запросе.

Смежные вопросы