2012-05-08 3 views
0

У меня проблема при попытке получить значения из массива. Я хочу получить все значения из этого массива, чтобы отображать их в IUTableView.Как получить значение многомерного массива

Должен ли я использовать функцию двойного действия?

{ 
1 =  { 
    dishId = 1; 
    dishName = "Tomato Salades"; 
    dishPrice = 13; 
    dishTypeId = 1; 
    dishTypeName = Starter; 
}; 
2 =  { 
    dishId = 2; 
    dishName = "Leeks Salades"; 
    dishPrice = 12; 
    dishTypeId = 1; 
    dishTypeName = Starter; 
}; 
3 =  { 
    dishId = 3; 
    dishName = Fries; 
    dishPrice = 14; 
    dishTypeId = 2; 
    dishTypeName = "Main Course"; 
}; 
4 =  { 
    dishId = 4; 
    dishName = Beef; 
    dishPrice = 15; 
    dishTypeId = 2; 
    dishTypeName = "Main Course"; 
}; 
7 =  { 
    dishId = 7; 
    dishName = "Cheese Cake"; 
    dishPrice = 8; 
    dishTypeId = 3; 
    dishTypeName = Dessert; 
}; 
menuCountry = France; 
menuDescription = "un menu pas comme les autres pour une region pas comme les autres"; 
menuId = 1; 
menuName = "Autour de l\\Alsace"; 
menuState = 1; 
} 

Это мой Python код, который создает словарь в массиве:

def getDishOfTheWeek(): 
menuArray = [] 
menuDic = Ddict(dict) 
    for menu in Menus.select().where(state=True): 

     menuDic['menuId']=menu.id 
     menuDic['menuName']=menu.name 
     menuDic['menuCountry']=menu.country.name 
     menuDic['menuDescription']=menu.description 
     menuDic['menuState']=menu.state 
     for d in DishMenuRels.select().where(menu = menu.id).join(Dishes).join(DishTypes).order_by((DishTypes,'name')): 
      menuDic[str(d.dish.id)] = {} 
      menuDic[str(d.dish.id)]['dishTypeName'] = d.dish.dishType.name 
      menuDic[str(d.dish.id)]['dishTypeId'] = d.dish.dishType.id 
      menuDic[str(d.dish.id)]['dishId'] = d.dish.id 
      menuDic[str(d.dish.id)]['dishName'] = d.dish.name 
      menuDic[str(d.dish.id)]['dishPrice'] = d.dish.price 
menuArray.append(menuDic) 
return json.dumps(menuArray) 

Это мой Объектив-C код для того, чтобы получить DataJson и поставить его в массив:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

switch (streamEvent) { 

    case NSStreamEventOpenCompleted: 
     [[ConnectionSingleton getInstance] setConnectionMade:YES]; 
     NSLog(@"Stream opened"); 
     break; 

    case NSStreamEventHasBytesAvailable: 
     if (theStream == inputStream) { 

      uint8_t buffer[1024]; 
      int len; 

      while ([inputStream hasBytesAvailable]) { 

       len = [inputStream read:buffer maxLength:sizeof(buffer)]; 

       if (len > 0) { 

        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 

        output = [output substringToIndex:[output length] - 2]; 

        if (nil != output) { 
         NSError* error;  // Obligatoir pour le JSON 

         menu = [NSJSONSerialization JSONObjectWithData:[output dataUsingEncoding:NSUTF8StringEncoding] options: 
            NSJSONReadingMutableContainers error:&error]; // Put Json in the Array 


         [[self tableView] reloadData]; // Reload Array to populate it 
        } 
       } 
      } 
     } 
     break;  

    case NSStreamEventErrorOccurred: 
     NSLog(@"Can not connect to the host!"); 
     break; 

    case NSStreamEventEndEncountered: 
     break; 

    default: 
     NSLog(@"Unknown event"); 
} 

} 
+0

Действительно ли это массив objecive-c? И что вы хотите делать с этими значениями? –

+0

вставить их в другую метку и строку ячеек И да, это и objectiv-c массив – socrateisabot

+0

Есть ли причина, по которой вы не просто используете быстрое перечисление? – Daniel

ответ

1

Я думаю, что это следует сделать трюк

NSArray *firstArray = [NSArray arrayWithObjects:[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",nil], [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",nil],[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",nil],[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",nil],[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",nil],@"String",@"String",@"String",@"String",@"String",nil]; 

NSInteger count_i = firstArray.count; 
NSInteger count_j; 
id val; 
for (NSInteger i = 0; i < count_i; i++) { 
    if ([[firstArray objectAtIndex:i] isKindOfClass:[NSArray class]]) { 
     count_j = [[firstArray objectAtIndex:i] count]; 
     for (NSUInteger j = 0; j < count_j; j++) { 
      val = [[firstArray objectAtIndex:i] objectAtIndex:j]; 
      NSLog(@"%@",val); 
     } 
    }else{ 
     val = [firstArray objectAtIndex:i]; 
     NSLog(@"%@",val); 
    } 
} 

Но ваши значения имеют разные типы, поэтому вам приходится иметь дело с ними по-разному в зависимости от значения j.

+0

Как я могу получить второй массив? – socrateisabot

+0

Извините, мой плохой. Я отредактировал свой ответ –

+0

, это не работает, если я сохраняю оператор if. Если я удалю его, у меня получится и ошибка во втором для циклов: Signal SIGABRT – socrateisabot

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