Вы можете получить контроллер вида сверху, используя нижнее расширение:
extension UIApplication {
class func getTopMostViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return getTopMostViewController(base: nav.visibleViewController)
}
if let tab = base as? UITabBarController {
if let selected = tab.selectedViewController {
return getTopMostViewController(base: selected)
}
}
if let presented = base?.presentedViewController {
return getTopMostViewController(base: presented)
}
return base
}
}
Используйте это расширение, чтобы получить самый верхний контроллер вида в стеке навигации, используя следующий код:
guard let topVC = UIApplication.getTopMostViewController() else {return}
Предустановите свой вид контроллер, использующий контроллер вида сверху:
DispatchQueue.main.async(execute: { () -> Void in
topVC.present(incomingcallController, animated: true, completion: nil)
}
Как насчет:
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
Или, чтобы обезопасить себя от проблем с вложенными макросами:
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));
Использование:
SAFE_GET(foo)
И вот что скомпилировано:
String str_foo = getFunction("foo");
Ключевые моменты:
Один из подходов - не указывать имя при вызове макроса:
#include <stdio.h>
#define GET( name ) \
int int##name = getFunction( #name ); \
int getFunction( char * name ) {
printf( "name is %s\n", name );
return 42;
}
int main() {
GET( foobar );
}
Отвечая на ваш вопрос, нет, вы не можете "снять" кавычки в C ++. Но, как показывают другие ответы, вы можете «добавить их». Так как вы всегда будете работать со строковым литералом (верно?), Вы сможете переключиться на новый метод.