2013-07-07 2 views
0

Этот вопрос был переписан, чтобы правильно донести намерения автораProgramatically изменения нескольких UIViews в masterDetail App

У меня есть MasterDetail приложение, которое в конечном счете станет способом отслеживать количество «игроков» через фиксированное количество «проблем» (точнее, 60). Задачи одинаковы для каждого игрока, в то время как статус каждого игрока по отдельным задачам может быть разным. Все данные о игроках хранятся в базе данных Postgres, а затем извлекаются с использованием JSONModel в LeftViewController. Я получаю все данные правильно из БД, и я успешно помещал его в NSMutableDictionary. Данные в словаре выглядит следующим образом (это один игрок):

player =  (
      { 
     id = 9; 
     name = "Arthur Dent"; 
     currentChallenge = "Cooking"; 
     timeStarted = "04 Jul 2013 1:08 PM"; 
     challengesDone = (
          { 
       challengeName = "Flying"; 
       timeCompleted = "04 Jul 2013 12:08 PM"; 
      } 
     ); 
     nextChallenge = "Swimming"; 
     freePass =    (
      Running, 
      "Climbing" 
     ); 
    }, 

Как вы можете видеть, у игрока есть какие-то проблемы «Done» («Готово»), некоторые ему не нужно делать («pass»), один он делает («currentChallenge») и один вызов, который он будет делать дальше («nextChallenge»). Для каждого из этих состояний, в котором может находиться игрок, я хочу, чтобы «Задачи», которые находятся в RightViewController, были закодированы цветом, чтобы вы могли понять, что происходит с первого взгляда. Мне нужны «вызовы», чтобы загорать разные цвета, основываясь на статусе игрока, который определяется данными, которые находятся в моем NSMutableDictionary.

Путем создания массивов из данных в NSDictionary я могу получить цвета, чтобы изменить, делая это:

if ([freePassArray containsObject:@"challenge three name"]) 
{ 
    UIImage *image = [UIImage imageNamed:@"status_pass.png"]; //status_pass.png is my color 
    [challengeThreeImageView setImage:image]; 
} 

Но если бы я сделал это так, я должен был бы написать 240, если и еще если заявления для охвата всех возможных статусов по всем 60 вызовам.

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

* LeftViewController.m * didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    //Re-fetch the feed from the Postgres Database when a user selects an entry 

    [JSONHTTPClient getJSONFromURLWithString:@"http://myurl" completion:^(NSDictionary *json, JSONModelError *err) { 
    NSError* error = nil; 
    _feed = [[PostgresFeed alloc] initWithDictionary:json error:&error]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil userInfo:[[json objectForKey:@"preclear"] objectAtIndex:indexPath.row]]; 

}]; 

Player *selectedPlayer = [_players objectAtIndex:indexPath.row]; 

if (_delegate) 
    { 
    [_delegate selectedPlayer:selectedPlayer]; 
    } 
} 

Так образы обыкновение устанавливать для всех игроки сразу, но они также не очищаются после выбора другого игрока.

Как мне изменить цвет, не записывая выражения 240 if и else if? и как я могу получить цвета, когда я выбираю другого игрока?

+0

только для уточнения, у вас есть список игроков, а в подробном представлении у вас есть все 50 задач. И для каждого выбора пользователя вы хотите увидеть, какая из 50 задач выполнена, свободна, текущая и проходит. это верно? – Vame

+0

@Vame Да, наверное, я мог так сказать. Ты прав. – CaptJak

+0

Я в замешательстве - что это имеет отношение к JSON? У вас есть значения, которые вы хотите использовать для управления состоянием определенных компонентов представления. Откуда взялись эти ценности, не имеет значения. –

ответ

0

Предполагая, что у вас есть все 50 изображений и вы знаете, какой вызов соответствует какой образ я бы поставил статус изображение на верхней части фактического вызова изображения:

- (void)setChallengesDone:(NSArray*)doneAr next:(NSArray*)nextAr current:(NSArray*)currentAr andPass:(NSArray*)passAr 
{ 
    // remove additions from the previous selected player 
    UIView *prevAdditionsView = [self.view viewWithTag:122333]; 
    while (prevAdditionsView != nil) 
    { 
     [prevAdditionsView removeFromSuperview]; 
     prevAdditionsView = [self.view viewWithTag:122333]; 
    } 

    for (int i=0; i<[doneAr count]; i++) 
    { 
     [self addChallengeImageAdditionWithImage:@"status_done" forChallenge:[doneAr objectAtIndex:i]]; 
    } 

    for (int i=0; i<[nextAr count]; i++) 
    { 
     [self addChallengeImageAdditionWithImage:@"status_next" forChallenge:[nextAr objectAtIndex:i]]; 
    } 

    for (int i=0; i<[currentAr count]; i++) 
    { 
     [self addChallengeImageAdditionWithImage:@"status_current" forChallenge:[currentAr objectAtIndex:i]]; 
    } 

    for (int i=0; i<[passAr count]; i++) 
    { 
     [self addChallengeImageAdditionWithImage:@"status_free" forChallenge:[passAr objectAtIndex:i]]; 
    } 
} 

- (void)addChallengeImageAdditionWithImage:(NSString*)image forChallenge:(NSString*)challengeTitle 
{ 
    UIImageView *challengeImage = [challenges objectForKey:challengeTitle]; 

    CGRect frame = challengeImage.frame; 
    UIImageView *statusImg = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:image]] autorelease]; 
    [statusImg setFrame:frame]; 
    [statusImg setAlpha:0.5]; // optionally add some transparency 
    [statusImg setTag:122333]; 
    [self.view addSubview:statusImg]; 
    [self.view bringSubviewToFront:challengeImage]; // bring challenge image to front 
} 

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

+0

Попытка разобраться в этом, извините. Думаю, я также должен сказать, что в настоящее время мои вызовы (имена задач) - это фактически png-изображения, которые говорят название задачи с фреймом, а остальное прозрачно, а за этим стоит «statusImageView», который будет показывать мои цвета , Не могли бы вы рассказать о том, как я буду делать словарь, который вы упомянули?И я предполагаю, что цикл for будет выглядеть как 'for ([notification.userinfo objectForKey: @" done "]), потому что все мои данные находятся в NSNotificationCenter? – CaptJak

+0

NSMutableDictionary * вызовы; в вашем классе, а затем в поле зрения инициализации: [вызовы setObject: @ «Water Fight» forKey: waterFightImageView]; для того, чтобы поставить statusImageView позади моего отредактированного ответа. – Vame

+0

ОК, я думаю, я понимаю, что вы имеете в виду. Но я все равно не вижу, чтобы приведенный выше код работал с данными, полученными от БД. Я включил свой DetailVC.m в вопрос, чтобы вы могли видеть, как поступают данные. Имея это в виду, как мне пойти на реализацию вашего кода выше? У меня нет класса для игроков или проблем, поэтому создание Словаря становится интересным. Простите меня, если это становится скучным, я все еще прихожу к этому языку. – CaptJak

0

Это прекрасный пример концепции модели/представления.

  • Каждый вызов представляет собой модель со всей необходимой информацией (имя задачи, статус, временная метка и другие).
  • Каждый из ваших 50 видов - это «вызов», который знает, как сделать любой вызов.
  • Состояние данные есть в модели; статус изображение есть на виду.

Пример:

-(void) drawChallenge: (Challenge*) challenge 
{ 
    // Draw challenge name as text 
    switch ([challenge status]) 
    { 
     case done: // draw "done" image 
     case next: // draw "next" image 
    } 
} 

Идея заключается в том, что задача сам не должен знать о том, как оно отображается, и вид не должен знать о том, что содержит вызов. Представление отвечает за его рисование.

Это может быть упаковано в подкласс ChallengeView UIView. Затем создайте свои 50 или около того ChallengeViews и вызовите [currentView drawChallenge: currentChallenge].

По существу, когда добавляется новая задача, вы создаете для нее представление и даете виду указатель на вызов. Когда представление вызова отображается iOS, оно будет рисовать «свою» задачу, как описано в методе drawChallenge.

Если вам нужна праймер на шаблоне Model-View-Controller, this section документов Apple довольно хорош. В этой ситуации вы можете игнорировать роль контроллера.

Смежные вопросы