Swift Bridging-Header Objective-C presentViewController

Posted

技术标签:

【中文标题】Swift Bridging-Header Objective-C presentViewController【英文标题】: 【发布时间】:2015-07-09 23:44:09 【问题描述】:

我正在尝试使用仅在 Objective-C 中可用的视图控制器。我已经设置了桥接头,但是当我运行我的方法时,它不包含 presentViewController 并给出错误 No visible @interface for 'AlertSelector' declares the selector 'presentViewController...'

.m

#import "AlertSelector.h"

@implementation AlertSelector : NSObject

- (void) someMethod 
    NSLog(@"SomeMethod Ran");
    UIAlertController * view=   [UIAlertController
                             alertControllerWithTitle:@"My Title"
                             message:@"Select you Choice"
                             preferredStyle:UIAlertControllerStyleActionSheet];

    UIAlertAction* ok = [UIAlertAction
                     actionWithTitle:@"OK"
                     style:UIAlertActionStyleDefault
                     handler:^(UIAlertAction * action)
                     
                         //Do some thing here
                         [view dismissViewControllerAnimated:YES completion:nil];

                     ];
    UIAlertAction* cancel = [UIAlertAction
                         actionWithTitle:@"Cancel"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         
                             [view dismissViewControllerAnimated:YES completion:nil];

                         ];

[view addAction:ok];
[view addAction:cancel];
[self presentViewController:view animated:YES completion:nil];

.h

@interface AlertSelector : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

来自斯威夫特

var instanceOfCustomObject: AlertSelector = AlertSelector()
    instanceOfCustomObject.someProperty = "Hello World"
    print(instanceOfCustomObject.someProperty)
    instanceOfCustomObject.someMethod()

【问题讨论】:

【参考方案1】:

您的AlertSelector 类不是UIViewController 的子类。这就是为什么您不能从AlertSelector 的实例调用[self presentViewController:view animated:YES completion:nil];

将视图控制器参数添加到您的 someMethod 方法并从该方法而不是 self 中显示。

【讨论】:

【参考方案2】:

presentViewController 是 UIViewController 的一个方法。您的 AlertSelector 类不是 UIViewController。

【讨论】:

【参考方案3】:

这与桥接头无关。是UIViewController 实现了presentViewController: 而不是NSObject,因此编译器会抱怨,因为NSObject 的接口上不存在presentViewController: 方法。

可能的解决方案

要么自己实现presentViewController:(这是一项艰巨的任务),要么让AlertSelectorUIViewController扩展

.h

@interface AlertSelector : UIViewController

【讨论】:

以上是关于Swift Bridging-Header Objective-C presentViewController的主要内容,如果未能解决你的问题,请参考以下文章

Swift:通过 Bridging-Header 文件导入时找不到 CorePlot-CocoaTouch.h 文件

Swift Bridging-Header Objective-C presentViewController

Bridging-Header.h 文件和错误“使用未声明的类型...”

OC与swift相互调用

OC与swift相互调用

OC工程调用Swift方法