Cómo agregar valor nulo 0r nill en "NSArray dynamic" en el Objetivo C

Me enfrento a un problema con respecto a agregar valor Null or nil en NSArray . En realidad estoy agregando valor Null porque mi recuento de matrices no es el mismo. Estoy agregando tres array en Custom TableViewCell dos array son de webservice y una matriz es de database. Estoy guardando IndexPath en core data y luego recuperándolos.

introduzca la descripción de la imagen aquí

Como se muestra en la Imagen, estoy guardando indexPath en String y lo convierto en NSInteger desde DidSelectAtIndexPath y lo muestro en cellForRowAtIndexPath . Mi problema es que está siendo anulado porque está almacenado en cadena. Así que lo conetworkingata en conetworkingata recupero, pero tengo un problema para el recuento de desajustes de array en cellforrowatindexpath . Mi código es así

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *STI=@"STI"; AuditTableViewCell *cell = (AuditTableViewCell *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:STI]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AuditTableViewCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; cell.accessoryType=UITableViewCellAccessoryNone; } cell.audittitlelbl.text=[NSString stringWithFormat:@"%@",[idarray objectAtIndex:indexPath.row]]; cell.auditdesclbl.text=[NSString stringWithFormat:@"%@",[namearray objectAtIndex:indexPath.row]]; NSManagedObject *device2 = [devices objectAtIndex:indexPath.row]; NSMutableArray *Checkarray=[devices valueForKey:@"Key"]; // Hear in this array I am getting Index count problem NSLog(@"Device =%@",device2); NSLog(@"Check Array =%@",Checkarray); if(indexPath.row == CurrentIndexPath) { cell.listlbl.text=GlobalString; [cell setBackgroundColor:[UIColor greenColor]]; } return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { CurrentIndexPath=indexPath.row; NSLog(@"Current Index Path =%ld",(long)CurrentIndexPath); GlobalIndexPath = [[NSString stringWithFormat: @"%ld", (long)CurrentIndexPath] mutableCopy]; NSManagedObjectContext *context = [self managedObjectContext]; if (self.device) { // Update existing device [device setValue:GlobalStringChk forKey:@"Key1"]; [device setValue:GlobalIndexPath forKey:@"Key"]; } else { // Create a new device NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Device" inManagedObjectContext:context]; [newDevice setValue:GlobalStringChk forKey:@"Key1"]; [newDevice setValue:GlobalIndexPath forKey:@"Key"]; } NSError *error = nil; // Save the object to persistent store if (![context save:&error]) { NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); } [Audittable reloadData]; NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Device"]; self.devices = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; } 

Este es mi código, escucho que estoy guardando indexpath en conetworkingata y recuperándolo en array. Tengo un problema para el recuento de array en cellforrowatindexpath . ¿Cómo puedo agregar el valor Null or nil en la matriz para que cuente get el mismo. My Array es una matriz dinámica. El problema principal es que necesito cambiar el color de la celda si el usuario hace clic en ella. Cuando almaceno el valor en NSInteger y lo convierto en path index, puedo cambiar el color. Pero solo para una celda en una hora.Cuando hago clic en el valor de otro número de celdas, obtuve la anulación. Entonces, para eso, lo guardo en los datos centrales y los recupero, pero cuando busco la matriz de datos del núcleo en cellforrowatindexpath se bloquea debido a un conteo diferente. ¡Gracias por adelantado!

No podemos agregar nil directamente dentro de una colección como NSMutableArray ya que generará una exception. Si es necesario agregar nil dentro de collections como NSMutableArray , podemos hacerlo usando una class singleton NSNull .

Por ejemplo, tenemos una matriz de tipo NSMutableArray , podemos agregar nil usando NSNull as-

 [array addObject:@"string"]; [array addObject:[NSNull null]]; 

… y así…

La class NSNull define un object singleton usado para representar valores null en objects de colección (que no permiten valores nil ).

Primero, no puede agregar elemets en NSArray , debe usar NSMutableArray en NSMutableArray lugar. En segundo lugar, no puede agregar nil en su NSMutableArray .

Por lo tanto, debe agregar una empty string lugar de nada nil ,

 NSMutableArray *arr = [[NSMutableArray alloc]init]; [arr addObject:@""]; 

o puede agregar el object NSNull como,

 [arr addObject:[NSNull null]]; 

Y puede verificar que la cadena esté vacía o no cuando desee mostrar en la UI de UI algo así (si se agrega una cadena vacía),

 NSString *tempStr = [arr objectAtIndex:0]; if (tempStr.length > 0) { NSLog(@"string is not empty."); } else{ NSLog(@"Sring is empty"); } 

Ok, tengo tu problema. En realidad, quiere fusionar datos de 3 arreglos diferentes en una sola celda, pero el problema es que su conteo de arreglos es diferente para cada arreglo. Sí, puedes hacer esto, pero tienes que cambiar la forma de codificar.

Supongamos que tiene 3 arrays a1, a2 y a3, con recuentos:

  • a1.count = 5,
  • a2.count = 8,
  • a3.count = 10

Aquí estoy asumiendo que a1 es una matriz de NSString mientras que a2 y a3 son matrices con numbers (NSIntegers)

Ahora crea una class simple henetworkingada de NSObject. Lo llamamos AuditTableViewDao. Es un simple object de acceso a datos

 #import <UIKit/UIKit.h> @interface AuditTableViewDao : NSObject @property (nonatomic) NSString *checkForWhat; @property (nonatomic) NSString *methodMeasures; @property (nonatomic) NSString *visualInspections; - (instancetype)initWithCheckForWhat:(NSString *)checkForWhat methodMeasures:(NSString *)methodMeasures visualInspections:(NSString *)visualInspections; @end 

Luego, en el file .m de este AuditTableViewDao.m, escriba la implementación para inicializar.

Luego, en su file ViewComtroller.m, cree una propiedad

 @property (nonatomic) NSMutableArray *arrayAuditTableViews; 

en viewDidLod, escribe

 self.arrayAuditTableViews = [[NSMutableArray alloc] init]; for (NSInteger index=0; index < a3.count; index++) { AuditTableViewDao *auditTableViewDao = nil; if (index < a1.count) { auditTableViewDao = [[AuditTableViewDao alloc] initWithCheckForWhat:((NSString *)[a1 objectAtIndex:index]) methodMeasures:[NSString stringWithFormat:@"%d", [a2 objectAtIndex:index]] visualInspections:[NSString stringWithFormat:@"%d", [a3 objectAtIndex:index]]]; } else if (index < a2.count) { auditTableViewDao = [[AuditTableViewDao alloc] initWithCheckForWhat:"" methodMeasures:[NSString stringWithFormat:@"%d", [a2 objectAtIndex:index]] visualInspections:[NSString stringWithFormat:@"%d", [a3 objectAtIndex:index]]]; } else if (index < a3.count) { auditTableViewDao = [[AuditTableViewDao alloc] initWithCheckForWhat:"" methodMeasures:"" visualInspections:[NSString stringWithFormat:@"%d", [a3 objectAtIndex:index]]]; } [self.arrayAuditTableViews addObject:auditTableViewDao]; } 

Y, finalmente, en su cellForRowAtIndexPath, use el object de arrayAuditTableViews en la ruta del índice perticular.

Debe agregar nulo en su matriz de esta manera:

 [yourArray addObject:[NSNull null]]; 

Agregar nulo

 [array addObject:[NSNull null]]; 

nil no es un object que puede agregar a una matriz: una matriz no puede contener nada. Esta es la razón por la que addObject: nil se bloquea.

No es necesario save la Ruta de índice en los datos centrales y no es necesario agregar el valor Nulo o Nulo.

Simplemente asigne NSMutableArray en el método viewDidLoad

 NSMutableArray *_selectedIndexPath = [[NSMutableArray alloc] init]; 

Luego en didSelectRowatIndexPath addObject en una matriz como esta

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (![_selectedIndexPath containsObject:indexPath]) { // Check if array does not contain selecting cell, add this cell to array [_selectedIndexPath addObject:indexPath]; [tableView reloadData]; } } 

Y luego en Cellforrowatindexpath

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ([_selectedIndexPath containsObject:indexPath]) { cell.backgroundColor=[UIColor greenColor]; } else { cell.backgroundColor=[UIColor whiteColor]; } } 

Y puede cambiar su color sin usar datos centrales ni valores nulos o nulos.