2011-08-30 30 views
11

Tôi cố gắng để cập nhật một đối tượng trong NSMutableArrayobjective-c: Cách cập nhật đối tượng trong 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; 
     } 
    } 

Tôi muốn biết rằng nếu có bất kỳ cách nào tốt hơn để làm điều này?

Trả lời

35

dòng Remove

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

và đó sẽ là ok!

+0

Có - "nhưng tại sao"? –

+4

Có bởi vì [NSArray objectAtIndex: index] trả về con trỏ cho đối tượng. – Nekto

+5

Sử dụng objectAtIndex để lấy giá trị, sửa đổi nó, và sau đó sử dụng replaceObjectAtIndex là tốt hơn. – afollestad

20

Đối cập nhật, sử dụng

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

Nhưng nó không phải là cần thiết trong trường hợp này, vì bạn đang thay đổi cùng một đối tượng.

10

Bạn có thể bắt đầu bằng cách sử dụng fast enumeration, nhanh hơn và dễ đọc hơn. Ngoài ra, bạn không cần phải loại bỏ và chèn các đối tượng, bạn chỉ có thể chỉnh sửa nó trong dòng. Như thế này:

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

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

(Is ProductList một đối tượng Nếu có, nó nên bắt đầu với một chữ cái thường:?. productList tên được viết hoa là dành cho các lớp học Ngoài ra, StatusQuantity là tài sản và nên quá bắt đầu với một chữ thường. lá thư. tôi rất đề nghị bạn làm theo các Cocoa naming conventions.)

+3

+1 cho quy ước đặt tên –

5

có hai phương pháp

  1. Tạo một đối tượng mới và thay thế các đối tượng cũ với đối tượng mới
  2. 012.
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; 
     } 

    } 

Cập nhật các đối tượng hiện có:

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

Sử dụng -insertObject:atIndex: hoặc replaceObjectAtIndex:withObject:.

Các vấn đề liên quan