将不兼容的类型分配给委托

时间:2014-07-09 20:07:53

标签: ios objective-c delegates uipopovercontroller

环境:运行iOS 8.0 SDK的Xcode版本6.0(6A254o)

   我正在尝试将主UIViewController(呈现控制器)指定为呈现弹出窗口UIViewController的委托:

#import "MainViewController.h"
#import "OrangeViewController.h"
#import "MessageViewController.h"

@interface MainViewController () <UIAdaptivePresentationControllerDelegate>{
    OrangeViewController *orangeVC;
    MessageViewController *msgVC;
}
@property (weak, nonatomic) IBOutlet UIBarButtonItem *helpBarItem;

@end

    @implementation MainViewController
    ...    
    - (void)viewDidLoad {
        [super viewDidLoad];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UIPopoverPresentationController *msgPC = [msgVC popoverPresentationController];
        msgPC.barButtonItem = self.helpBarItem;
        msgPC.delegate = self; <-- incompatible type
        msgPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
        msgVC.preferredContentSize = CGSizeMake(260.0, 240.0);
    }

但是我为委托获得了一个不兼容的作业:

enter image description here

  

... MainViewController.m:40:20:分配给   'id'来自不兼容的类型   'MainViewController * const __strong'

如何将MainViewController(self)从'const-strong'更改为与UIPopover视图控制器兼容(或通过最佳解决方案)?

2 个答案:

答案 0 :(得分:2)

我不小心使用了错误的声明。
当我通过帖子编辑时添加了错误陈述的屏幕截图,我注意到了这一点。

正确:

enter image description here

...反对INCORRECT

<UIAdaptivePresentationControllerDelegate>

答案 1 :(得分:1)

MainViewController的接口文件中(或在实现文件的扩展名中),您应声明MainViewController实现UIPopoverPresentationControllerDelegate协议。

您可以在MainViewController.m中执行类似的操作:

@interface MainViewController () < UIPopoverPresentationControllerDelegate >
@end

或者,在MainViewController.h中,您可以在主< UIPopoverPresentationControllerDelegate >之后添加@interface MainViewController。我通常只在我希望外部类知道我的类实现协议时才将协议声明放在头文件中。

编辑:在您更新的问题中,看起来您已经有了正确的想法,声明MainViewController实现了协议,但您没有使用正确的协议。 MainViewController应该实现UIPopoverPresentationControllerDelegate,而不是UIAdaptivePresentationControllerDelegateUIPopoverPresentationControllerDelegate继承自UIAdaptivePresentationControllerDelegate,但您指定的委托属性需要UIPopoverPresentationControllerDelegate,而不是UIAdaptivePresentationControllerDelegate