【问题标题】:iOS: In a Swift class, how to use NSClassFromString of a Obj-C Class?iOS:在 Swift 类中,如何使用 Obj-C 类的 NSClassFromString?
【发布时间】:2018-04-20 07:14:54
【问题描述】:

我有在 Obj-C 中工作的代码,但无法找到通过 NSClassFromString 函数快速使用 Obj-C 的方法:

NSArray *viewControllers = [[self navigationController] viewControllers];
    BOOL viewExists = NO;
    id obj;
    for (int i = 0; i < [viewControllers count]; i ++)
    {
        obj = [viewControllers objectAtIndex:i];
        if ([obj isKindOfClass:NSClassFromString(@"myViewController")])
        {
            if ([[obj valueForKey:@"synchroRunning"] boolValue])
            {
                [self performSelectorOnMainThread:@selector(startSpinner) withObject:nil waitUntilDone:NO];
                [synchroBtn setHidden:YES];
            }
            else
            {
                [self synchroClick:nil];
            }
            viewExists = YES;
        }
    }

如果我想使用它:

如果让 vcObj = obj 为?我的视图控制器 通过在网桥中导入#import "myViewcontroller.h" 类,我收到一条错误消息:

<unknown>:0: error: failed to emit precompiled header '/Users/OlostA/Library/Developer/Xcode/DerivedData/Formbox-fpnftywlyjuvvubjjzpknxxdyhul/Build/Intermediates.noindex/PrecompiledHeaders/Formbox-Bridging-Header-swift_7N984CYB20BK-clang_28VAG4OSP9DZS.pch' for bridging header '/Users/OlostA/Desktop/Git/FormBox/formbox/Formbox/Planning/Formbox-Bridging-Header.h'

提前致谢。

【问题讨论】:

  • 您的问题不清楚。您问题的 Swift 部分是什么?你想把这个 Objective-C 代码翻译成 Swift 吗?如果是这样,请编辑您的问题以包含您尝试的 Swift 代码。
  • 这可能会有所帮助stackoverflow.com/a/24808338/1570343
  • 为什么需要NSClassFromString?为什么不简单地[ViewController class]?无论如何,这应该像if let vcObj = obj as? ViewController 一样很好地转换为 Swift。
  • UINavigationController 的 viewControllers 数组在 Swift 中将被键入为 [UIViewController],因此根本不需要进行类型检查
  • Losiowaty 因为当我在桥中添加#import "ViewController.h" 时,我有一条错误消息“。我把这条消息放在票证中

标签: ios objective-c swift class swift3


【解决方案1】:

假设 self.navigationController 存在于这个控制器中,这里是你的 swift 版本的代码:

    let viewControllers = self.navigationController!.viewControllers
    var viewExists = false

    for obj in viewControllers {
        if let running = obj.value(forKey: "synchroRunning") as? Bool {
            self.performSelector(onMainThread: #selector(startSpinner), with: nil, waitUntilDone: false)
        } else {
            self.synchroClick(nil)
        }

        viewExists = true
    }

您不需要NSClassFromString 来确定类型是否为ViewController,它是Swift 中的类型化数组,因此保证为ViewController 类型。如果您希望它为空,请确保在循环之前检查viewControllers.count &gt; 0。

【讨论】:

  • 您好,我刚刚在我的工单中添加了 ViewController,是我的班级名称。为了更容易理解,我将其更改为 myViewController。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2015-06-18
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多