2014-02-05 3 views
-2

Когда кто-то голосует за вопрос ... любезно, пожалуйста, также прокомментируйте, почему вы его проголосовали.iOS: Dereferencing NSMutableArray

У меня есть UIView (myHolderView), на котором я хочу разместить 9 или более других views. Я добавил несколько экземпляров UIView (MyView) в NSMutableArray из 9 элементов().

На MyView есть надпись (UILabel). Может кто-нибудь, пожалуйста, помогите, как получить текст ярлыка, используя ?

Примечание:

  • Я видя UIViews добавил к основному зрения держателя и получения этикетки на нем.

  • initWithFrame:(v,v,v,v) number: (value) это метод init, с которым я перегрузил init.

    // Эти два объявлены как глобальная переменная

    NSMutableArray *tiles; 
    MyView *tile; 
    
    @implementation ViewController 
    @synthesize myHolderView; 
    - (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
    tiles=[[NSMutableArray alloc]initWithCapacity:9]; 
    
    for (int xIndex=0; xIndex<3; xIndex++) 
    { 
        for(int yIndex=0; yIndex<3; yIndex++) 
        { 
         static int label=0; 
         [tiles addObject:[[MyView alloc]initWithFrame:CGRectMake(value,value,value,value) 
              number:[[NSString alloc] initWithFormat:@"%d",label+1]]]; 
    
          [self.myHolderView addSubview:tiles[label]]; 
    
         //Now - when I want to print the labels onto Console as NSLog messages 
         //it is printing null 
    
         MyView *n=[[MyView alloc]init]; 
         n=(MyView *)[tiles objectAtIndex:label++]; 
         NSLog(@"%@---", n.myLabel.text); 
    
         //this also does not work. Definitely wrong dereferencing 
         //   NSLog(@"%@---", (MyView*) [tiles ObjectAtIndex:1].mylabel.text); 
    
         //label++; 
    
         } 
        } 
    } 
    

Пожалуйста, помогите

как разыменовать NSMuableArray объектов к типу того, что мы хотим ( типа мы знаем это точно)

MyView:

- (id)initWithFrame:(CGRect)frame number:(NSString *)num; 
{ 
    self = [super initWithFrame:frame]; 

    if (self) { 
     MyView *tile = [[[NSBundle mainBundle] loadNibNamed:@"XView" owner:self options:nil] objectAtIndex:0]; 
     tile.myLabel.text=num; 
     [self addSubview:tile]; 
    } 

    return self; 
} 
+0

Почему в цикле вы не просто создать новый экземпляр и ссылаться на него? Ваше использование 'label ++', вероятно, вызовет проблемы, поскольку ваш подход грязный. – Wain

+0

Я тоже это пробовал!И если вы видите, что я комментировал label ++ как отдельный оператор. Мой дизайн должен был быть изменен, и мне нужно иметь ссылку на созданные вами представления. Итак, я хотел сохранить свои ссылки в каком-то массиве. Итак, мне нужны представления, которые нужно добавить в массив. Можете ли вы предложить, как разыменовать объекты этого NSMutableArray в MyView? – Chandu

+0

Если вы добавили свой просмотр в holderview, он уже удерживает его. то почему вы держите его снова? – Mani

ответ

0

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

Изменить реализация MyView:

- (id)initWithFrame:(CGRect)frame number:(NSString *)num; 
{ 
    self = [[[NSBundle mainBundle] loadNibNamed:@"XView" owner:self options:nil] objectAtIndex:0]; 
    self.frame = frame; 
    self.myLabel.text = num; 

    return self; 
} 

Попробуйте что-то вроде этого (набранный рядный так что следите за вопросы):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    tiles = [[NSMutableArray alloc] initWithCapacity:9]; 

    NSUInteger counter = 0; 

    for (int xIndex=0; xIndex<3; xIndex++) 
    { 
     for(int yIndex=0; yIndex<3; yIndex++) 
     { 
      MyView *newView = [[MyView alloc] initWithFrame:CGRectMake(value,value,value,value) number:[[NSString alloc] initWithFormat:@"%d", counter+1]]]; 
      [self.myHolderView addSubview:newView]; 

      [tiles addObject:newView]; 

      MyView *logView = (MyView *)[tiles objectAtIndex:counter]; 
      NSLog(@"view %d is %@---", counter, logView.myLabel.text); 
      counter++; 
     } 
    } 
} 
+0

NSLog (@ "view% d is% @ ---", counter, ((MyView *) [tiles objectAtIndex: counter]). MyLabel.text); ((MyView *) [плитка objectAtIndex: counter]). после оператора DOT ... опция не myLabel, а MyView и т. Д. Я не думаю, что уровень разыменования правильный. – Chandu

+0

Я положил пару строк в неправильном порядке ... – Wain

+0

MyView * n = (MyView *) [tiles objectAtIndex: label]; NSLog (@ "% @ -% d", n.myLabel.text, label); n.myLabel.text (null), где по мере приближения метки 0, 1, 2 и т. Д. Для каждой итерации. – Chandu

0

По вашему комментарию, вы хотите добавить некоторые посмотрите на свой аккаунт. Позже вы хотите изменить текст в определенном представлении. Поэтому я предлагаю кое-что. Я думаю, это поможет ..

1) создать и добавить подвид на ваш взгляд держателя

for (int xIndex=0; xIndex<9; xIndex++) 
{ 
     MyView *subView = [[MyView alloc]initWithFrame:CGRectMake(value,value,value,value) 
          number:[[NSString alloc] initWithFormat:@"%d",somecount+1]]]; // doesn't know why do you try this.. 
     subView.tag = xIndex; 
     [self.myHolderView addSubview: subView]; 

} 

2) Получить особый подвид со значением тега. (Нет необходимости поддерживать какой-либо другой массив в вашей точки зрения контроллер) Через некоторое время вы хотите изменить текст в определенном представлении. Просто попробуйте ..

MyView *subView = [self.myHolderView viewWithTag:index]; // as like, you access array 
subView.myLabel.text = yourUpdateText; 
+0

Тип кастинга не работает. MyView имеет ярлык. где myHolderView - это просто вид. И я придумал это, что, по очевидным причинам, может привести к краху приложения. Но спасибо за ваш ответ. – Chandu

+0

@Chandu Друг, где вы видели литье в моем коде? – Mani

+0

Не явный брат! Неявные. LHS не совместим с RHS. – Chandu

0
#import "ViewController.h" 

@interface MyView : UIView 
@property UILabel *myLabel; 
- (id) initWithFrame: (CGRect) rect number: (NSString *) string; 
@end 

@implementation MyView 
- (id) initWithFrame: (CGRect) frame number: (NSString *) number { 
    self = [super initWithFrame:frame]; 
    if (!self) return nil; 
    // Any things here 
    // Are you initialized label? 
    _myLabel = [UILabel new]; 
    [_myLabel setText:number]; 
    [self addSubview:_myLabel]; 
    return self; 
} 
@end 

@interface ViewController() 
@property UIView *myHolderView; 
@end 

NSMutableArray *tiles; 
MyView *tile; 

@implementation ViewController 
@synthesize myHolderView; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    tiles=[[NSMutableArray alloc]initWithCapacity:9]; 
    int value = 1, label = 0; 
    myHolderView = [UIView new]; 

    for (int xIndex=0; xIndex<3; xIndex++) { 
     for(int yIndex=0; yIndex<3; yIndex++) { 
      NSString *number = [[NSString alloc] initWithFormat:@"%d",label+1]; 
      MyView *myView = [[MyView alloc]initWithFrame:CGRectMake(value,value,value,value) 
                number:number]; 
      [tiles addObject:myView]; 

      [self.myHolderView addSubview:tiles[label]]; 

      //Now - when I want to print the labels onto Console as NSLog messages 
      //it is printing number 

      MyView *n=(MyView *)[tiles objectAtIndex:label++]; 
      NSLog(@"%@---", n.myLabel.text); 
     } 
    } 

    // And without tiles array 
    for (UIView *subView in [myHolderView subviews]) 
     for (UIView *subSubView in [subView subviews]) 
      if ([subSubView isKindOfClass:[UILabel class]]) 
       NSLog(@"%@", [(UILabel *) subSubView text]); 
} 
@end 
Смежные вопросы