informacion familiar familia esta espacio disponible desactivar cuenta contigo configurar compartir comparte como apple app ios objective-c

ios - familiar - informacion de familia no disponible



¿No se puede asignar a uno mismo fuera de un método en la familia init? (4)

Estoy usando self como " self = [super init]; ", el siguiente código me da un error " cannot assign to self out of a method in the init familycannot assign to self out of a method in the init family "

- (id)showDropDown:(UIButton *)b:(CGFloat *)height:(NSArray *)arr:(NSString *)direction { btnSender = b; animationDirection = direction; self = [super init]; if (self) { // Initialization code CGRect btn = b.frame; self.list = [NSArray arrayWithArray:arr]; if ([direction isEqualToString:@"up"]) { self.frame = CGRectMake(btn.origin.x, btn.origin.y, btn.size.width, 0); self.layer.shadowOffset = CGSizeMake(-5, -5); }else if ([direction isEqualToString:@"down"]) { self.frame = CGRectMake(btn.origin.x, btn.origin.y+btn.size.height, btn.size.width, 0); self.layer.shadowOffset = CGSizeMake(-5, 5); } self.layer.masksToBounds = NO; self.layer.cornerRadius = 8; self.layer.shadowRadius = 5; self.layer.shadowOpacity = 0.5; table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, btn.size.width, 0)]; table.delegate = self; table.dataSource = self; table.layer.cornerRadius = 5; table.backgroundColor = [UIColor colorWithRed:0.239 green:0.239 blue:0.239 alpha:1]; table.separatorStyle = UITableViewCellSeparatorStyleSingleLine; table.separatorColor = [UIColor grayColor]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; if ([direction isEqualToString:@"up"]) { self.frame = CGRectMake(btn.origin.x, btn.origin.y-*height, btn.size.width, *height); } else if([direction isEqualToString:@"down"]) { self.frame = CGRectMake(btn.origin.x, btn.origin.y+btn.size.height, btn.size.width, *height); } table.frame = CGRectMake(0, 0, btn.size.width, *height); [UIView commitAnimations]; [b.superview addSubview:self]; [self addSubview:table]; } return self; }

Error:

Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''Requesting the window of a view (<NIDropDown: 0x684ac50; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; layer = (null)>) with a nil layer. This view probably hasn''t received initWithFrame: or initWithCoder:.


Creo que tienes que cambiar el nombre de tu inicializador (actualmente llamado showDropDown ) a algo que comienza con init (como initWithDropDown… ). Esto solía ser solo una convención (aunque razonable), pero ahora con ARC es un requisito difícil.


No puedes inicializarte fuera de un método init debido a la siguiente convention :

Si la clase de un objeto no implementa un inicializador, el tiempo de ejecución de Objective-C invoca el inicializador del antepasado más cercano en su lugar.

y porque el sistema de administración de memoria del tiempo de ejecución reconoce el nombre de algunos métodos:

Cuando el nombre de un método comienza con asignar init, retener o copiar, significa que se está creando para quien llama, quien tiene la responsabilidad de liberar el objeto cuando termine con él. De lo contrario, el método devuelto no es propiedad del llamante, y él tiene que indicar que desea mantenerlo reteniendo la llamada en el objeto.

Por lo tanto, todos los inicializadores deben escribirse como una variación de esto:

- (id) init { self = [super init]; if (self){ _someVariable = @"someValue"; } return self; }

  • No uses if ((self = [super init])) porque es feo.
  • No utilice self.someVariable porque es posible que el objeto aún no se haya inicializado. Utilice el acceso variable directo en su lugar ( _someVariable ).
  • Escribimos self = [super init] y no solo [super init] porque se puede devolver una instancia diferente.
  • Escribimos if (self) porque habrá casos en los que se devolverá nil .

Sin embargo, hay dos problemas más con su método:

  • Estás combinando la creación de objetos ( [super init] ) y una acción ( -showDropDown:::: en el mismo método. Deberías escribir dos métodos separados en su lugar.
  • El nombre de tu método es -showDropDown:::: . Los programadores de Objective-C esperan nombres de métodos de auto-documentación como -showDropDown:height:array:direction: lugar. Supongo que vienes de un idioma diferente, pero cuando estés en Roma, haz lo que hacen los romanos , o de lo contrario no jugarás junto con el resto del equipo.

Revisa tu ortografía en este método

-(id)initwithArray:(NSArray *)array

Código: (Objective-C)

-(id)initWithArray:(NSArray *)array


Si su método es un inicializador, debe comenzar con init :

- (instancetype)initWithDropDown:(UIButton *)b:(CGFloat *)height:(NSArray *)arr:(NSString *)direction

De lo contrario, puede cambiarlo para que sea un método de clase y devolver una nueva instancia:

+ (instancetype)showDropDown:(UIButton *)b:(CGFloat *)height:(NSArray *)arr:(NSString *)direction { btnSender = b; animationDirection = direction; YourClassName obj = [[self alloc] init]; if (obj) { // Initialization code // … } return obj; }