Obtener una configuration de advertencia de delegado para un protocolo personalizado.

agregué un protocolo personalizado a una de mis classs y obtengo una advertencia del comstackdor cuando bash establecer el delegado durante un método prepareForSegue: la advertencia que recibo es …

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

el proyecto se genera y ejecuta y todo funciona bien less la advertencia. si agrego <NSFileManagerDelegate> a mi class personalizada, la advertencia desaparece. Me estoy perdiendo algo o es un error en Xcode (6 beta)? el código es un código estándar para configurar un protocolo / delegado, pero lo publicaré de todos modos …

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 

CustomClass.h

 #import <UIKit/UIKit.h> #import “ SomeSecondViewController.h” @interface MyCustomViewController : UIViewController <SomeSecondCustomViewControllerDelegate> //adding on <NSFileManagerDelegate> removes the warning... @end 

CustomClass.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 

He abierto proyectos anteriores donde la advertencia no existía y ahora aparece la misma advertencia. Me pregunto si este es un problema de Xcode?

Se está encontrando con un problema causado por una ambigüedad en cómo Objective-C encuentra un selector coincidente y se ocupa de una reference de id .

UIStoryboardSegue destinationViewController devuelve un id . Su código entonces intenta llamar al método setDelegate en esta reference de id . Como no hay información sobre lo que realmente hace reference a este id , no sabe qué método setDelegate: puede significar (hay muchos). Entonces, el comstackdor explora la list que sabe y selecciona uno. En este caso, eligió el método setDelegate: de la class NSFileManager . Dado que self no se ajusta al protocolo NSFileManagerDelegate , obtienes la advertencia.

Puede ignorar la advertencia y su código funcionará bien en este caso.

La mejor solución es ayudar al comstackdor agregando un yeso:

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

Esto le permitirá al comstackdor saber qué setDelegate: método que realmente quiere decir.

BTW: agregar NSFileManagerDelegate a su class no es una solución válida, incluso si funciona en este momento. Un simple reorderamiento de algunas declaraciones de import podría llevar al comstackdor a tomar una decisión diferente y su advertencia volvería, pero se quejan de no conformarse con algún otro protocolo.

como resultado, este es un error / cambio en Xcode 6 beta. ejecutar este mismo código en Xcode 5.1.1 no produce advertencias ni errores. el problema es porque, en Xcode 6, el comstackdor pregunta por el tipo

 (id<NSFileManager>) 

para el delegado en Xcode 5.1 el comstackdor simplemente está esperando

 (id) 

para el tipo de delegado.

como Rmaddy dijo, echando el tipo en

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

Eliminó la advertencia, pero este debería ser un paso innecesario y lo descifrará a un problema con Xcode.

Intenta escribir explícitamente (dar tipo a) the destinationVC, así:

 SomeSecondCustomViewController *vc = (SomeSecondCustomViewController *)segue.destinationViewController; vc.delegate = self; 

@rmaddy proporciona la respuesta correcta. Este es un ejemplo más detallado para aquellos de nosotros que somos ligeramente educados en las forms de Objective-C.

Cambié mi código de:

  [[segue destinationViewController] setDelegate:self]; UIPopoverController *popoverController = [(UIStoryboardPopoverSegue *)segue popoverController]; self.flipsidePopoverController = popoverController; popoverController.delegate = self; 

a:

  [(UIPopoverController *)segue.destinationViewController setDelegate:self]; UIPopoverController *popoverController = [(UIStoryboardPopoverSegue *)segue popoverController]; self.flipsidePopoverController = popoverController; popoverController.delegate = self; 

y las advertencias desaparecieron.