2011-08-30 13 views
11

Próbuję zaktualizować obiekt w NSMutableArraycel-c: Jak zaktualizować obiekt w NSMutableArray?

Product *message = (Product*)[notification object]; 
    Product *prod = nil; 


    for(int i = 0; i < ProductList.count; i++) 
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      prod.Status = @"NotAvaiable"; 
      prod.Quantity = 0; 
      [ProductList removeObjectAtIndex:i]; 
      [ProductList insertObject:prod atIndex:i]; 
      break; 
     } 
    } 

Chcę wiedzieć, że jeśli jest jakiś lepszy sposób to zrobić?

Odpowiedz

35

usuwanie linii

 [ProductList removeObjectAtIndex:i]; 
     [ProductList insertObject:prod atIndex:i]; 

i że będzie OK!

+0

Tak - "ale dlaczego"? –

+4

Istnieje, ponieważ [NSArray objectAtIndex: index] zwraca wskaźnik do obiektu. – Nekto

+5

Użycie objectAtIndex do pobrania wartości, zmodyfikowania jej, a następnie użycia metody replaceObjectAtIndex jest lepsze. – afollestad

20

za aktualizację, należy użyć

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

Ale to nie jest konieczne w tym przypadku, ponieważ jesteś modyfikowanie tego samego obiektu.

10

Możesz zacząć od użycia fast enumeration, która jest szybsza i łatwiejsza do odczytania. Ponadto nie trzeba usuwać i wstawiać obiektu, można go po prostu edytować w linii. Tak:

Product *message = (Product*)[notification object]; 

for(Product *prod in ProductList) 
{ 
    if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
    { 
     prod.Status = @"NotAvailable"; 
     prod.Quantity = 0; 
     break; 
    } 
} 

(Czy ProductList przedmiotem Jeśli tak jest, należy rozpocząć od małej litery:. productList nazwy pisane wielką literą są dla klas Również Status i Quantity są właściwości i powinien też zacząć od małej litery. list. Gorąco zalecamy postępować zgodnie Cocoa naming conventions.)

+3

+1 dla konwencji nazewnictwa –

5

Istnieją dwa podejścia

  1. Utwórz nowy obiekt i zastąpić stary obiekt z nowym obiektem
for(int i = 0; i < ProductList.count; i++)   
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      newObj = [[Product alloc] autorelease]; 
      newObj.Status = @"NotAvaiable"; 
      newObj.Quantity = 0; 
      [ProductList replaceObjectAtIndex:i withObject:newObj]; 
      break; 
     } 

    } 

Aktualizacja istniejącego obiektu:

for(int i = 0; i < ProductList.count; i++) 
    { 
     prod = [ProductList objectAtIndex:i]; 
     if([message.ProductNumber isEqualToString:prod.ProductNumber]) 
     { 
      prod.Status = @"NotAvaiable"; 
      prod.Quantity = 0; 
      break; 
     } 
    } 
4

Zastosowanie -insertObject:atIndex: lub replaceObjectAtIndex:withObject:.

Powiązane problemy