gpt4 book ai didi

ios - 为自定义协议(protocol)设置委托(delegate)时收到警告

转载 作者:可可西里 更新时间:2023-11-01 06:19:37 25 4
gpt4 key购买 nike

我向我的一个类添加了一个自定义协议(protocol),当我尝试在 prepareForSegue: 方法期间设置委托(delegate)时,我收到编译器警告。我得到的警告是……

Sending 'MyCustomViewControllerClass *const __strong' to parameter of incompatible type 'id<NSFileManagerDelegate>'

项目构建并运行,除警告外一切正常。如果我添加<NSFileManagerDelegate>对于我的自定义类(class),警告消失了。我错过了什么或者这是 Xcode (6 beta) 中的错误吗?该代码是用于设置协议(protocol)/委托(delegate)的标准代码,但无论如何我都会发布它......

SomeSecondClass.h

#import <UIKit/UIKit>

@class SomeSecondCustomViewController;

@protocol SomeSecondCustomViewControllerDelegate <NSObject>
- (void)doThisForMe
@end

@interface SomeSecondCustomViewController : UIViewController

@property (weak, nonatomic) id <SomeSecondCustomViewControllerDelegate> delegate;

@end

SomeSecondClass.m

@interface SomeSecondViewController ()
…stuff

-(void)someMethod {

[self.delegate doThisForMe];
}

@end

自定义类.h

#import <UIKit/UIKit.h>
#import “ SomeSecondViewController.h”

@interface MyCustomViewController : UIViewController <SomeSecondCustomViewControllerDelegate>
//adding on <NSFileManagerDelegate> removes the warning...
@end

自定义类.h

...standard stuff...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"MySegue"]) {

//this is where the warning happens on "self"
[segue.destinationViewController setDelegate:self];

}
}


- (void)doThisForMe {

//doing some stuff...

}
@end

我打开了以前不存在警告的项目,现在出现了相同的警告。我想知道这是否是 Xcode 问题?

最佳答案

您遇到的问题是由 Objective-C 如何找到匹配的选择器和处理 id 引用的歧义引起的。

UIStoryboardSegue destinationViewController 返回一个 id。然后,您的代码会尝试在此 id 引用上调用 setDelegate 方法。由于没有关于此 id 实际引用的内容的信息,因此它不知道您可能指的是哪个 setDelegate: 方法(有很多)。所以编译器扫描它知道的列表并选择一个。在本例中,它从 NSFileManager 类中选择了 setDelegate: 方法。由于 self 不符合 NSFileManagerDelegate 协议(protocol),您会收到警告。

您可以忽略该警告,在这种情况下您的代码将正常工作。

更好的解决方案是通过添加强制转换来帮助编译器:

[(SomeSecondCustomViewController *)segue.destinationViewController setDelegate:self];

这会让编译器知道您真正指的是哪个 setDelegate: 方法。

顺便说一句 - 将 NSFileManagerDelegate 添加到您的类中并不是一个有效的解决方案,即使它目前可以工作。对某些 import 语句进行简单的重新排序可能会导致编译器做出不同的选择,并且您的警告会返回但会提示不符合某些其他协议(protocol)。

关于ios - 为自定义协议(protocol)设置委托(delegate)时收到警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24248825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com