【问题标题】:Assigning incompatible type to a delegate将不兼容的类型分配给委托
【发布时间】:2023-03-03 13:36:02
【问题描述】:

环境:运行 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);
    }

但是,我得到了一个不兼容的委托分配:

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

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

【问题讨论】:

  • 请检查您的 MainViewController 类是否符合 协议。

标签: ios objective-c delegates uipopovercontroller


【解决方案1】:

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

正确的:

...不正确的诗句

<UIAdaptivePresentationControllerDelegate>

【讨论】:

    【解决方案2】:

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

    你可以在你的 MainViewController.m 中做这样的事情:

    @interface MainViewController () < UIPopoverPresentationControllerDelegate >
    @end
    

    或者,在 MainViewController.h 中,您可以在主 @interface MainViewController 之后包含 &lt; UIPopoverPresentationControllerDelegate &gt;。仅当我希望外部类知道我的类实现了协议时,我通常才将协议声明放在标头中。

    编辑:在您更新的问题中,您似乎已经有了正确的想法,即声明 MainViewController 实现了一个协议,但您没有使用正确的协议。 MainViewController 应该实现UIPopoverPresentationControllerDelegate,而不是UIAdaptivePresentationControllerDelegate。 UIPopoverPresentationControllerDelegate 继承自 UIAdaptivePresentationControllerDelegate,但您分配的委托属性需要 UIPopoverPresentationControllerDelegate,而不是 UIAdaptivePresentationControllerDelegate。

    【讨论】:

    • 我已经有了:@interface MainViewController : UIViewController 。 ...但仍然有警告。
    • 啊,我想我们都错了。你要实现的协议是UIPopoverPresentationControllerDelegate,它继承自UIAdaptivePresentationControllerDelegate,但是UIAdaptivePresentationControllerDelegate还不够“够用”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多