كيف يمكنني تعديل CGRECT مخزنة باسم NSValue في NSAray؟

StackOverflow https://stackoverflow.com/questions/2201321

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أقوم بإنشاء nsarray مع cgrects باستخدام السطر التالي:

[self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]]

ثم أحاول تحديث CGRects في الصفيف، كل ذلك في كثير من الأحيان مثل هذا:

for (NSValue *bound in myArray)
  {
   CGRect myRect = [bound CGRectValue];
   myRect.origin.y += 2;
  }

ومع ذلك، هذا لا يعمل، عندما يعمل الحلقة مرة أخرى، فإن الأصل لا يزال هو نفسه. أفترض أن هذا لديه علاقة مع غلاف NSValue؟، ماذا يمكنني أن أفعل ذلك يتم تحديث القيمة بالفعل في الصفيف؟ شكرا لك.

-oscar.

هل كانت مفيدة؟

المحلول

كائنات NSValue غير قابلة للتغيير لذلك لا يوجد شيء يمكنك القيام به. يجب عليك استخدام مجموعة قابلة للتغيير واستبدال الكائن الموجود بمثيل NSValue الجديد الذي يحتوي على المستقيم الجديد.

نصائح أخرى

كما ذكر الآخرين، NSValue الحالات ليست قابلة للتغيير حتى يتعين عليك إعادة إنشاءها ثم استبدالها في NSMutableArray.

خيار آخر هو استخدام المزيد من إدارة الذاكرة الكلاسيكية C (malloc / free) وإدارة صفيفك بهذه الطريقة. لا حرج في الذهاب إلى هذا الطريق. عليك فقط أن تكون أكثر حذرا لأنها لا تتمتع بمستوى عال كمادة برمجة تطبيقات الهدف.

// Create an array to hold 100 rectangles
CGRect* rectangles = (CGRect*) malloc(100 * sizeof(CGRect));

// Change the rectangle at index 2 (remember arrays are 0 based, so this is the 3rd)
CGRect* rect = &rectangles[2];
rect->size.width /= 2.0;

// Shortcut for accessing rectangles
rectangles[2].size.width = 100.0;

// Get rid of the array
free(rectangles);

قد يكون أسرع أيضا إذا كنت تعمل على سبيل المثال لعبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top