Создание представлений на лету из массива - PullRequest
0 голосов
/ 12 апреля 2011

Мне нужно создать кучу видов на лету. Мне было интересно, что будет лучшим способом сделать это, так как мне не нужно определять координаты, теги, цвета каждого вида.

Нужно ли создавать многомерный массив, и если да, то как я могу это сделать?

CGRect viewRect1 = { 80.0, 200.0, 160.0, 100.0 };
UIview *myview1 = [[UIview alloc] initWithFrame:viewRect1];
[myview1 setBackgroundColor:[UIColor darkGrayColor]];

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Вам необходимо определить структуру для хранения данных, необходимых для создания вашего UIView.

@interface MyViewDataHolder :NSObject
{
     CGRect mViewRect;
     UIColor* mDarkGrayColor;
     NSInterger mTag;
}

@end

Затем создайте объект вышеупомянутого класса И присвойте значения в элементе, затем добавьте это в ваш NSArray ...

РЕДАКТИРОВАНИЕ:

В классе MyViewDataHolder.h

@interface MyViewDataHolder :NSObject
{
    CGRect mViewRect;
    UIColor* mDarkGrayColor;
    NSInteger mTag;
}
@property (nonatomic,assign) CGRect mViewRect;
@property (nonatomic,retain) UIColor* mDarkGrayColor;
@property (nonatomic,assign) NSInteger mTag;

@end

В классе MyViewDataHolder.mm

#import "MyViewDataHolder.h"


@implementation MyViewDataHolder

@synthesize mViewRect,mDarkGrayColor,mTag;

-(void) dealloc
{
    [mDarkGrayColor release]
    mDarkGrayColor = nil;
}

Теперь, как его использовать ....

Создание объектов MyViewDataHolder, как показано ниже ...

MyViewDataHolder* myObj1 = [[MyViewDataHolder alloc] init];
myObj1.mViewRect = CGRectMake(x,y,width,height);
myObj1.tag = 1;
myObj1.mDarkGrayColor = [UIColor redColor];

Создайте столько, сколько вам нужно

Затем создайте NSMutableArray и добавьте каждый объект MyViewDataHolder в NSMutableArray.

NSMutableArray* myArray = [[NSMutableArray alloc] init];
[myArray addObject:myObj1];
[myArray addObject:myObj2];
[myArray addObject:myObj3];
and So on ....

Когда вам нужна сохраненная информация, вы можете использовать, как показано ниже ...

for(int index =0; index < [myArray count]; index++)
{

     MyViewDataHolder* myObj = (MyViewDataHolder*)[myArray objectAtIndex:index];
     myView = [[UIView alloc] initWithFrame:myObj.mViewRect];
     //incriment x and y to refelect where you want your next view to be suituated 
     myView.tag = myObj.mTag; 
     myView.backgroundColor =  myObj.mDarkGrayColor;
     [self.view addSubview:myView];
     [myView release];
}

Код отражает подход, хотя я не компилировал код, так что используйте его как ссылку

Спасибо,

0 голосов
/ 12 апреля 2011

Вам на самом деле не нужно хранить свои представления в массиве, если только это просто для удобства.

Вы можете создавать представления с переменной суммой, используя цикл for:

UIView *myView;
int x=0, y=0; 
int viewWidth = 50, viewHeight = 50;
for(int i=0; i<numberOFView; i++){
     myView = [[UIView alloc] initWithFrame:CGRectMake(x,y,viewWidth,viewHeight)];
     //incriment x and y to refelect where you want your next view to be suituated 
     myView.tag = i+1; 
     [self.view addSubview:myView];
     [myView release];
}

Затем, чтобы получить доступ к каждому представлению по очереди и выполнить некоторую работу, вы можете сделать следующее:

for (UIView *view in self.view.subviews) {
    switch (view.tag) {
       case 1:
           //do something to the view 
           break;
       case 2:
           //do something to the view 
           break;
       case 3:
           //do something to the view
           break;
       //and so on...   
      default:
           break;
   }
}
...