尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类

Posted

技术标签:

【中文标题】尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类【英文标题】:Can't Instantiate Obj C Class in Swift in spite of working bridging header 【发布时间】:2016-04-20 18:30:43 【问题描述】:

我正在努力将单个目标 c 类拉入 swift。我的桥接头工作得很好——当我输入它时,Xcode 甚至会建议 obj c 类的名称。我什至设法从我的 swift 文件中引用了同一个头文件中的委托协议:

BrowserViewController.swift

import UIKit

class BrowserViewController: UIViewController, BrowserTabViewDelegate 

    @IBOutlet weak var browserView: UIView!
    @IBOutlet weak var webViewContainer: UIView!


    override func viewDidLoad() 
        super.viewDidLoad()

        let tabview: BrowserTabView = BrowserTabView();
        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


Sreen cap of the error: Use of unresolved identifier 'BrowserTabView'. 请注意,BrowserTabViewDelegate 在被引用时没有任何问题。它来自与 BrowserTabView 相同的 obj c 标头。它建议类名,但我不能调用它。

BrowserTabView.h

#import <UIKit/UIKit.h>
@class BrowserTabView;

@protocol BrowserTabViewDelegate <NSObject>

@optional

-(void)BrowserTabView:(BrowserTabView *)browserTabView didSelectTabAtIndex:(NSUInteger)index;
-(void)BrowserTabView:(BrowserTabView *)browserTabView willRemoveTabAtIndex:(NSUInteger)index;
-(void)BrowserTabView:(BrowserTabView *)browserTabView didRemoveTabAtIndex:(NSUInteger)index;
-(void)BrowserTabView:(BrowserTabView *)browserTabView exchangeTabAtIndex:(NSUInteger)index withTabAtIndex:(NSUInteger)toIndex;
-(BOOL)BrowserTabView:(BrowserTabView *)tabView shouldChangeTitle: (NSString*)title;

@end

@interface BrowserTabView : UIView <UIGestureRecognizerDelegate, UITextFieldDelegate>

@property (nonatomic, strong) UIImage *backgroundImage;
@property (nonatomic, readonly) NSUInteger numberOfTabs;
@property (nonatomic, readonly) NSInteger selectedTabIndex;

@property (nonatomic, readonly) NSMutableArray *reuseQueue;
@property (nonatomic, weak) id<BrowserTabViewDelegate> delegate;

-(id)initwithTabTitles:(NSArray *)titles andDelegate:(id)del;
-(void)addTabWithTitle:(NSString *)title;
-(void)setTabTitlesWithArray:(NSArray *)titles;
-(void)setSelectedTabIndex:(NSInteger)selectedTabIndex animated:(BOOL)animation;
-(void)removeTabAtIndex:(NSInteger)index animated:(BOOL)animated;
- (void)handleLongPress:(UILongPressGestureRecognizer *)gr;
- (void)handlePanGesture:(UIPanGestureRecognizer *)sender;


@end

这是我第一次在这样的问题上被困这么久......我见过的大多数现有问题都与错误的桥接头有关 - 但我很确定我的问题很好.让我知道我是否可以清理我的问题,并提前感谢您的帮助。

WI Vision-Bridging-Header.h

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
#import "BrowserTabView.h"
#import "BrowserTab.h"

【问题讨论】:

很抱歉让您感到困惑。你能发布桥接头吗? 完成,问题的底部 BrowserTab 是否导入 BrowserTabView?它们有什么关系吗? 他们都相互导入 - 但据我所知,两者都在构建没有任何问题。 这可能是个问题,因为您可能有一个无法解决的导入周期。您是否只在 .m 文件中添加导入? 【参考方案1】:

真是个好问题。这看起来像一个错误,我们可以将它记录到 Swift 的社区。以下方式更改委托将对您有所帮助:

@protocol BrowserTabViewDelegate <NSObject>

@optional

-(void)browserTabView:(BrowserTabView *)browserTabView didSelectTabAtIndex:(NSUInteger)index;
-(void)browserTabView:(BrowserTabView *)browserTabView willRemoveTabAtIndex:(NSUInteger)index;
-(void)browserTabView:(BrowserTabView *)browserTabView didRemoveTabAtIndex:(NSUInteger)index;
-(void)browserTabView:(BrowserTabView *)browserTabView exchangeTabAtIndex:(NSUInteger)index withTabAtIndex:(NSUInteger)toIndex;
-(BOOL)browserTabView:(BrowserTabView *)tabView shouldChangeTitle: (NSString*)title;

@end

在方法名称中应该使用 browserTabView 而不是 BrowserTabView

【讨论】:

我记录了一个问题。让我们看看他们重播了什么:bugs.swift.org/browse/SR-1279 @Bengovernment 这有意义吗?顺便说一句,该问题已解决为重复。据我了解,这是一段时间的预期行为。类似的问题可以用纯 Swift 重现。 这是正确的。这么奇怪的问题。感谢您的帮助!

以上是关于尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Swift 项目中添加 Objective C 桥接头

Swift:导入桥接头失败

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

Objective-C Swift 桥接头

Objective-C Swift 桥接头