Как создать массив UIButton и установить его заголовок с содержимым словаря JSON? - PullRequest
1 голос
/ 04 января 2012

Я относительно новый в Objective C, я разработал приложение сервер-клиент и закодировал как на стороне сервера, так и на стороне клиента.Я получаю объекты JSON после отправки GET на сервер, и мне нужно, чтобы заголовки, которые поступают через массив JSON (словарь), задавались как заголовки кнопок в представлении моего приложения.Я также хочу создавать кнопки динамически, я имею в виду, если я сбросил некоторые кнопки, изменения должны прийти в мое приложение снова.Пожалуйста, кто-нибудь может мне помочь:

  1. Как создать массив UIButton и установить его заголовок с содержимым словаря JSON?
  2. Как динамически размещать кнопки в представлении,Я тоже могу поделиться кодом, если хотите ..

    button = 1;ключ = 181abc88e57c37a42769;сообщение = ({ID = 1; дата = "2011-12-10 16:00:00"; сообщение = asdf; статус = 1; "user_id" = 2;});"неправильный_пользователь" = 0;

Это результат для первого получения, и после определения его фарвибелей я получаю следующие данные JSON:

Response of Result2: (
    {
    ID = 1;
    name = Ambulance;
},
    {
    ID = 2;
    name = Police;
},
    {
    ID = 3;
    name = "Somethings";
},
    {
    ID = 4;
    name = Something Else;
}

)

мне нужно создать несколько кнопок в моем представлении и установить их названия с именами в этих данных JSON.Весь мой код GET ниже, мои имена переменных могут быть не очень понятными, извините за это. Кстати, я считаю, сколько идентификаторов приходит для массива кнопок, и я буду использовать его при создании кнопок, чтобы установитькнопки включены-отключены и т. д. Еще раз спасибо

        //## GET code to here**
    NSString *str1=[@"?username=" stringByAppendingString:userNameField.text];
    NSString *str2=[@"&password=" stringByAppendingString:passwordField.text];
    NSString *str3=[str1 stringByAppendingString:str2];
    NSString *str4 =[@"http://" stringByAppendingString:serverField.text];


    NSURL *url=[NSURL URLWithString:[str4 stringByAppendingString:[@"/ipad/login.php" stringByAppendingString:str3]]];
    NSLog(@"%@\n",url);
    //get the url to jsondata
    NSData *jSonData=[NSData dataWithContentsOfURL:url];

    if (jSonData!=nil) {
        NSError *error=nil;
        id result=[NSJSONSerialization JSONObjectWithData:jSonData options:
                   NSJSONReadingMutableContainers error:&error];

        if (error==nil) {


            NSDictionary *mess=[result objectForKey:@"message"];
            NSDictionary *messContent=[mess valueForKeyPath:@"message"];
            NSDictionary *messDate=[mess valueForKeyPath:@"date"];
            NSDictionary *messID=[mess valueForKeyPath:@"ID"];




            NSLog(@"%@ *** Message %@ \n Message Content: %@ \n Mesage ID: %@ \n Message Date: %@", result, mess, messContent, messID,messDate);
            NSString*key1=[ result objectForKey:@"key" ];

            NSString *s1=[@"http://" stringByAppendingString:serverField.text];
            NSString *s2=[s1 stringByAppendingString:@"/ipad/button.php"];

            NSURL *url2=[NSURL URLWithString:[s2 stringByAppendingString:[@"?key=" stringByAppendingString:key1]]];
            NSLog(@"\n%@\n",url2 );
            NSData *data2=[NSData dataWithContentsOfURL:url2];

            id result2=[NSJSONSerialization JSONObjectWithData:data2 options:NSJSONReadingMutableContainers error:nil];

            NSLog(@"\n\n\n*******   ************   \n\n  ***********  ***********\n\nResponse of Result2: %@",result2);
            NSArray *idd=[result2 valueForKeyPath:@"ID"];
            NSString *iddName=[result2 valueForKeyPath:@"name"];
            NSLog(@"-- %@ -- %@ -- \n The Count Of Buttons: %d", idd, iddName, [idd count]);
            id sender;

            [self performSegueWithIdentifier:@"sg1" sender:sender];

        }
    }

Я все еще не смог получить результат.У него проблема с [view addSubview:button], я объявил его как UIViewController *view; и подготовил его свойство, но на этот раз не принимает свойства с UIViewContrpller.Пожалуйста, кто-нибудь может дать какую-то идею, я тоже погуглил результаты, но ничего не смог понять.Оба представления принадлежат одному и тому же классу, одно представление для учетной записи пользователя, а другое для панели приложения (я имею в виду, где я хочу разместить кнопки)

1 Ответ

1 голос
/ 04 января 2012

Вот как вы создаете кнопку:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

// set a handler to do something when the user presses the button
[button addTarget:self 
           action:@selector(yourTouchDownHandler:)
 forControlEvents:UIControlEventTouchDown];

// button title will come from the JSON data
[button setTitle:@"this is the button title" forState:UIControlStateNormal];

// you have to change the following line so that buttons do not overlap
button.frame = CGRectMake(10.0, 10.0, 100.0, 44.0);

[view addSubview:button]; // this is what makes your button show up on screen

Вот как вы создаете массив и добавляете к нему кнопки:

NSMutableArray* buttons = [NSMutableArray array];
[buttons addObject:button];

Больше вам ничего не поможет, если выукажите формат данных JSON, но это должно помочь вам начать.

edit

Вы можете создать метод с этим содержимым:

self.buttons = [NSMutableArray array];

CGFloat yPosition = 10.0f;
const CGFloat buttonHeight = 44.0f;
const CGFloat buttonMargin = 4.0f;

for(NSDictionary* buttonData in result2) {
    NSString* buttonTitle = [buttonData objectForKey:@"name"];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    // set a handler to do something when the user presses the button
    [button addTarget:self 
               action:@selector(yourTouchDownHandler:)
     forControlEvents:UIControlEventTouchDown];

    NSString* buttonTitle = [buttonData objectForKey:@"name"];
    [button setTitle:buttonTitle forState:UIControlStateNormal];

    button.frame = CGRectMake(10.0f, yPosition, 100.0f, buttonHeight);

    [view addSubview:button];
    [self.buttons addObject:button];

    yPosition+= buttonHeight + buttonMargin;
}

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

// remove old buttons
for(UIButton* button in self.buttons) {
    [button removeFromSuperview];
}
...