Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 获取警告设置自定义协议的委托_Ios_Objective C_Xcode_Xcode6 - Fatal编程技术网

Ios 获取警告设置自定义协议的委托

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

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

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;