2016-12-09 57 views
9

Mam do czynienia z problemem dotyczącym dodania wartości Null or nil w NSArray. Właściwie dodaję wartość Null ponieważ moja tablica nie jest taka sama. Dodaję trzy tablice w Custom TableViewCell dwie tablice są z usługi sieci web i jedna tablica jest z bazy danych. Oszczędzam IndexPath w core data, a następnie odzyskuję.Jak dodać wartość null 0r w "dynamicznym NSArray" w Objective C

enter image description here

Jak widać na obrazu mam oszczędności indexPath STRING i przekształcenia go w NSInteger z DidSelectAtIndexPath i pokazać je w cellForRowAtIndexPath. Mój problem polega na tym, że jest on zastępowany, ponieważ jest przechowywany w łańcuchu znaków. Tak, aby zapisać go w coredata a i pobrać go, ale mam problem z niezaangażowania tablicy w cellforrowatindexpath. Moje kodu jest jak ten

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     static NSString *[email protected]"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]; 
} 

To jest mój kod usłyszeć Jestem oszczędność indexpath w coredata i pobieranie go w tablicy. Mam problem z liczbą tablic w cellforrowatindexpath. Jak mogę dodać wartość Null or nil w tablicy, aby liczba była taka sama. Mój Array jest dynamicznym array.The Głównym problemem jest to, że muszę zmienić kolor komórki, jeśli użytkownik kliknie na it.when przechowywać wartość w NSInteger i przekształcić go w indexpath mogę zmienić kolor, ale tylko na jedną komórkę w time.Kiedy kliknę na inną wartość całkowitą komórki, pomiń. W związku z tym zapisuję go w podstawowych danych i odtwarzam, ale kiedy pobieram główną tablicę danych w cellforrowindexpath, następuje awaria z powodu innej liczby. Dzięki Advance!

+0

Możliwy duplikat [jak dodać zero do nsmutablearray?] (Http://stackoverflow.com/questions/2057910/how-to-add-nil-to-nsmutablearray) – Puvanarajan

+0

@Puvanarajan Zadaję pytanie Jak dodać dynamiczną tablicę, która jest pytaniem dla statycznej tablicy. I moje pytanie dotyczy problemu zliczania w cellforrowatindexpath. Przeczytaj pełne pytanie. – Muju

+0

@Muju zostało rozwiązane? – Joshua

Odpowiedz

1

Nie trzeba zapisywać indeksu Path w danych podstawowych i nie trzeba dodawać wartości Null ani Nill.

Wystarczy Alloc NSMutableArray w metodzie viewDidLoad

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

potem w didSelectRowatIndexPath addObject w tablicy jak ten

- (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]; 
     } 
    } 

A potem w cellForRowAtIndexPath

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

I można zmienić kolor bez przy użyciu danych podstawowych i wartości zerowej lub zerowej.

+0

To nie jest odpowiedź, o którą prosi OP, OP pyta, jak dodać 'nil lub null' w tablicy !!! – Lion

7

nie możemy dodać nil bezpośrednio wewnątrz kolekcji jak NSMutableArray jak to podniesie wyjątek. Jeśli w ogóle wymagane jest dodanie nil w kolekcjach takich jak NSMutableArray, możemy to zrobić, używając pojedynczej klasy NSNull.

Na przykład, mamy tablicę typu NSMutableArray, możemy dodać nil użyciu NSNull as-

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

... i tak dalej ...

Klasa NSNull definiuje Singleton przedmiot używany do reprezentowania null wartości w obiektach collection (które nie pozwalają nil wartości).

+0

Dodając addObject moja aplikacja ulega awarii. Czy jest jakiś inny sposób dodania klasy NSNull do NSMutableArray. – Muju

+0

@Muju, używasz metody addObject: na NSMutableArray? –

+0

@sanjayMohanani Tak na NsMutableArray w cellforrowatexpath. – Muju

4

Po pierwsze nie można dodawać elemetów w NSArray, należy zamiast tego użyć NSMutableArray. Druga sprawa, nie można dodać nil w NSMutableArray.

Tak, należy dodać empty string zamiast nil coś takiego,

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

[arr addObject:@""]; 

lub można dodać NSNull obiektu podobnego,

[arr addObject:[NSNull null]]; 

I można sprawdzić, że ciąg jest pusta lub nie, kiedy chcą do wyświetlenia w UI coś w stylu (jeśli dodano pusty ciąg),

NSString *tempStr = [arr objectAtIndex:0]; 

if (tempStr.length > 0) { 

    NSLog(@"string is not empty."); 
} 
else{ 

    NSLog(@"Sring is empty"); 
} 
+0

Twój kod pokazuje błąd [__NSArrayI addObject:]: nierozpoznany selektor wysłany do instancji – Muju

+0

@Muju zadeklarowałeś NSArray zamiast NSMutableArray, w przeciwnym razie błąd nie powiedziałby '__NSArrayI' – vitormm

+0

http://stackoverflow.com/a/7684642/4370893 – vitormm

2

Ok Mam twój problem.W rzeczywistości chcesz scalić dane z 3 różnych tablic w jedną komórkę, ale problem polega na tym, że liczba tablic jest różna dla każdej tablicy. Tak, możesz to zrobić, ale musisz zmienić sposób kodowania.

Załóżmy masz 3 tablice A1, A2 i A3, z powodów:

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

Tutaj jestem zakładając a1 jest tablicą NSString podczas A2 & a3 są tablice z numerami (NSIntegers)

teraz utwórz jedną prostą klasę dziedziczącą z NSObject. Nazywamy to AuditTableViewDao. To jest proste Data Access Object

#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 

Następnie w pliku .m tego AuditTableViewDao.m, pisać realizacja zainicjować.

Następnie w pliku ViewComtroller.m, tworzyć jedną właściwość

@property (nonatomic) NSMutableArray *arrayAuditTableViews; 

w viewDidLod, pisać

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]; 
    } 

i wreszcie w swoim cellForRowAtIndexPath, Użyj przedmiot arrayAuditTableViews na perticular ścieżki indeksu.

+0

Nie chcę się scalać. Mam problem z liczbą tablic – Muju

+0

Tak, mam ten problem z różną liczbą tablic. Sugeruję więc, aby utworzyć nową tablicę z instancjami AuditTableViewDao. Gdzie możesz łatwo umieścić wszystkie puste ciągi. Później łatwo będzie ci manipulować – appleBoy21

+0

, co sugeruję, to połączenie danych wymaganych w twojej komórce w jeden obiekt z twoich 3 różnych tablic. – appleBoy21

2

Trzeba dodać wartość null w tablicy tak:

[yourArray addObject:[NSNull null]]; 
2

Dodaj zerowy

[array addObject:[NSNull null]]; 

zerowa nie jest obiektem, który można dodać do tablicy: Tablica nie może zawierają zero. Dlatego addObject: nil zawiesza się.