Объекты, добавленные как подпредставление к просмотру прокрутки, не отображаются - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь добавить элементы в представление прокрутки, используя этот код:

int missionCount;
[connection release];

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSDictionary *missionsDict = [responseString JSONValue];
/*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
NSLog(@"user Info array is: %@", missionsDict);
//    NSDictionary *array = [luckyNumbers1 objectForKey:@"data"];
NSDictionary *missionsData;
missionsData = [missionsDict objectForKey:@"data"];
NSLog(@"missionsData is: %@", missionsData);
NSEnumerator *inner = [missionsData objectEnumerator];
missionsScroll.contentSize = CGSizeMake(768, 1005);

id value;
int badgeY1;
int badgeY2;
int badgeY3;
badgeY1 = 146;
badgeY2 = 188;
badgeY3 = 188;
while((value = [inner nextObject])) {
    NSLog(@"value is: %@", value);
    NSLog(@"progress is: %@", [value objectForKey:@"progress"]);
    NSLog(@"user Info array is: %@", missionsDict);
    NSLog(@"name is: %@",[value objectForKey:@"reward_definitions"]);
    NSLog(@"missionsData is: %@", missionsData);
    NSDictionary *moreData;
    moreData = [value objectForKey:@"reward_definitions"];
    NSEnumerator *inner2 = [moreData objectEnumerator];
    id value2;
    int badgeX;
    int badgeCount;
    badgeX = 0;
    badgeCount = 0;
    while((value2 = [inner2 nextObject])) {
        UIProgressView *progressView;
        progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(323, badgeY1, 372, 9)];
        float progressValue;
        progressValue = ([[[value objectForKey:@"progress"] objectForKey:@"earned"] floatValue] / [[[value objectForKey:@"progress"] objectForKey:@"possible"] floatValue]);
        NSLog(@"progressValue is: %f", progressValue);
        [progressView setProgress:progressValue];
        [missionsScroll addSubview:progressView];
        UILabel *missionName;
        missionName = [[UILabel alloc] initWithFrame:CGRectMake(66, badgeY1, 227, 21)];
        missionName.backgroundColor = [UIColor clearColor];
        missionName.textColor = [UIColor whiteColor];
        missionName.font = [UIFont fontWithName:@"Heiti TC" size:23.0];
        missionName.text = [value objectForKey:@"name"];
        [missionsScroll addSubview:missionName];

        UILabel *requirementsLabel;
        requirementsLabel = [[UILabel alloc] initWithFrame:CGRectMake(66, badgeY2+25, 227, 21)];
        requirementsLabel.backgroundColor = [UIColor clearColor];
        requirementsLabel.textColor = [UIColor whiteColor];
        requirementsLabel.font = [UIFont fontWithName:@"Papyrus" size:19];
        requirementsLabel.text = @"To complete you need:";
        [missionsScroll addSubview:requirementsLabel];

        NSLog(@"Image URL is: %@", [value2 objectForKey:@"image_url"]);
        NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:@"%@", [value2 objectForKey:@"image_url"]]];            
        NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
        UIImage *image1 = [UIImage imageWithData:urlData1];
        UIImageView *badge = [[UIImageView alloc] initWithImage:image1];
        [badge setFrame:CGRectMake(badgeX, badgeY2+70, 70, 70)];               
        [missionsScroll addSubview:badge];
        [badge release];
        badgeCount = badgeCount+1;
        NSLog(@"badgeCount is: %i", badgeCount);
        if (badgeCount == 4) {
            NSLog(@"Badge Count = 4");
            badgeY2 = badgeY2 +70;
            badgeX = 0;
            badgeCount = 0;
        } else {
            NSLog(@"Badge Count ≠ 4");
            badgeX = badgeX +75;
        }

    }
    NSLog(@"1st While loop done");

    // NSLog(@"reward_definitions is: %@", [missionsData objectForKey:@"id"]);
    //       NSLog(@"Image URL is: %@", [[value objectForKey:@"reward_definitions"] objectForKey:@"image_url"]);
    //if ( [array isKindOfClass:[NSDictionary class]] ) {
    badgeY1 = badgeY1 +200;

    badgeY2 = badgeY2 +200;

    badgeY3 = badgeY3 +200;
    missionCount = missionCount+1; 
}
NSLog(@"While loops done");

for (int a; missionCount > 4; a = a+1) {
    missionsScroll.contentSize = CGSizeMake(776, missionsScroll.contentSize.height+200);
}

Ничего не отображается в представлении прокрутки.

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Непонятно, что происходит, но сначала нужно проверить, где представления действительны (не nil) и что этот код выполняется в основном потоке.

Вставьте их и опубликуйте результаты.

   NSLog(@"missionsScroll: %@", (missionsScroll==nil)?@"NIL":@"OK");
   NSLog(@"progressView: %@", (progressView==nil)?@"NIL":@"OK");
   NSLog(@"missionName: %@", (missionName==nil)?@"NIL":@"OK");
   NSLog(@"mainThread: %@", ([NSThread isMainThread])?@"OK":@"Background Thread");
1 голос
/ 23 августа 2011

Сколько раз ваши циклы while повторяются? Внешний цикл увеличивает Y-позицию ваших меток. Но метки будут отображаться только в конце цикла выполнения / начала следующего цикла выполнения. Если вы выйдете из этого метода с метками с высоким значением y, вы их не увидите. (Неважно, сколько раз вы меняете значение y во время выполнения этого кода. Дисплей будет обновляться только после того, как все будет сделано.)

** Исправление ** Похоже, вы добавляете новые представления каждый раз вокруг цикла while. Так что на самом деле я ожидаю, что у вас будет несколько копий подпредставлений, которые появятся, когда они наконец будут отображены.

(Здесь много кода, чтобы разобраться. Если мой ответ еще не получен, вы могли бы получить лучшие ответы, но обрезав часть кода и изолировав проблему.)

1 голос
/ 23 августа 2011

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

NSLog(@"Frame of badge %@", NSStringFromCGRect(badge.frame));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...