Ios 获取警告设置自定义协议的委托
我在我的一个类中添加了一个自定义协议,当我在prepareForSegue:方法期间尝试设置委托时,会收到一条编译器警告。我得到的警告是Ios 获取警告设置自定义协议的委托,ios,objective-c,xcode,xcode6,Ios,Objective C,Xcode,Xcode6,我在我的一个类中添加了一个自定义协议,当我在prepareForSegue:方法期间尝试设置委托时,会收到一条编译器警告。我得到的警告是 Sending 'MyCustomViewControllerClass *const __strong' to parameter of incompatible type 'id<NSFileManagerDelegate>' 自定义类.h #import <UIKit/UIKit.h> #import “ SomeSecondV
Sending 'MyCustomViewControllerClass *const __strong' to parameter of incompatible type 'id<NSFileManagerDelegate>'
自定义类.h
#import <UIKit/UIKit.h>
#import “ SomeSecondViewController.h”
@interface MyCustomViewController : UIViewController <SomeSecondCustomViewControllerDelegate>
//adding on <NSFileManagerDelegate> removes the warning...
@end
...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问题?尝试显式键入(给类型)destinationVC,如下所示:
SomeSecondCustomViewController *vc = (SomeSecondCustomViewController *)segue.destinationViewController;
vc.delegate = self;
由于Objective-C查找匹配选择器和处理
id
引用的方式不明确,您遇到了一个问题
UIStoryboardSegue destinationViewController
返回一个id
。然后,您的代码尝试在此id
引用上调用setDelegate
方法。由于没有关于这个id
实际引用什么的信息,它不知道您可能指的是哪个setDelegate:
方法(有很多)。因此,编译器扫描它知道的列表并选择一个。在本例中,它从NSFileManager
类中选择了setDelegate:
方法。由于self
不符合NSFileManagerDelegate
协议,您将收到警告
您可以忽略该警告,在这种情况下,您的代码可以正常工作
更好的解决方案是通过添加强制转换来帮助编译器:
[(SomeSecondCustomViewController *)segue.destinationViewController setDelegate:self];
这将让编译器知道您真正指的是哪个setDelegate:
方法
顺便说一句,将
NSFileManagerDelegate
添加到类中不是一个有效的解决方案,即使它目前可以工作。对一些import语句进行简单的重新排序可能会导致编译器做出不同的选择,您的警告会返回,但会抱怨不符合其他协议。事实证明,这是Xcode 6 beta中的错误/更改。在Xcode 5.1.1上运行完全相同的代码不会产生警告或错误。问题的原因是,在Xcode 6中,编译器要求输入类型
(id<NSFileManager>)
对于委托类型
正如rmaddy所述,通过在
[(SomeSecondCustomViewController *)segue.destinationViewController setDelegate:self];
它确实删除了警告,但这应该是一个不必要的步骤,并将其归因于Xcode的问题 @rmaddy提供了正确的答案。这是一个更详细的例子,对于我们这些在Objective-C方面受教育较少的人来说 我将代码更改为:
[[segue destinationViewController] setDelegate:self];
UIPopoverController *popoverController = [(UIStoryboardPopoverSegue *)segue popoverController];
self.flipsidePopoverController = popoverController;
popoverController.delegate = self;
致:
警告消失了。我已经这样做了,它也删除了警告,但在prepareForSegue期间这应该是一个不必要的步骤:因为这个过程应该已经为您完成了。我以前从未在Xcode 5中遇到过这个错误,这让我陷入了一个循环。对于任何略读的人来说,这是Xcode 6中为了快速兼容性而进行的编译器更改。前进Swift将期望设置代理的“as”类型。这与上述铸造相同。我猜这就是为什么警告只出现在Xcode 6中。
(id)
[(SomeSecondCustomViewController *)segue.destinationViewController setDelegate:self];
[[segue destinationViewController] setDelegate:self];
UIPopoverController *popoverController = [(UIStoryboardPopoverSegue *)segue popoverController];
self.flipsidePopoverController = popoverController;
popoverController.delegate = self;
[(UIPopoverController *)segue.destinationViewController setDelegate:self];
UIPopoverController *popoverController = [(UIStoryboardPopoverSegue *)segue popoverController];
self.flipsidePopoverController = popoverController;
popoverController.delegate = self;