【问题标题】:How to create an UIButton array and set their title with content of JSON dictionary?如何创建 UIButton 数组并使用 JSON 字典的内容设置其标题?
【发布时间】:2012-01-04 13:53:37
【问题描述】:

我在 Objective C 中相对较新,我设计了一个服务器-客户端应用程序,并对服务器端和客户端进行了编码。我在将 GET 发送到服务器后收到 JSON 对象,我需要的是,通过 JSON 数组(字典)来的标题被设置为我的应用程序视图中按钮的标题。我还想动态创建按钮,我的意思是如果我重置一些按钮,更改必须再次出现在我的应用程序中。请任何人帮助我:

  1. 如何创建 UIButton 数组并将其标题设置为 JSON 字典?
  2. 如何在视图中动态放置按钮。我可以分享代码 如果你愿意,也可以..

    按钮 = 1; 键 = 181abc88e57c37a42769; 消息 = ( { ID = 1; 日期=“2011-12-10 16:00:00”; 消息 = asdf; 状态 = 1; “用户 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 代码如下,我的变量名可能不太清楚,抱歉.. 顺便说一下,我计算了按钮数组有多少个 ID,我将在创建按钮时使用它,以便设置按钮启用-禁用等..再次感谢

        //## 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 的属性。请有人能给出任何想法,我也用谷歌搜索了结果,但什么也想不通。这两个视图属于同一类,一个视图用于用户帐户,另一个视图用于应用程序面板(我的意思是我要放置按钮的位置)

【问题讨论】:

  • 了解 JSON 数据格式会有所帮助

标签: objective-c ios5 uibutton


【解决方案1】:

这是创建按钮的方式:

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 数据格式,否则无法为您提供更多帮助,但这应该可以帮助您入门。

编辑

你可以用这个内容创建一个方法:

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];
}

【讨论】:

  • 感谢 Portela,但我再次分享了代码。这个答案也很清楚,但只是我的事。 “将按钮添加到数组”是什么意思?你能解释一下吗
  • 我有一个登录视图(页面)和第二个视图(主视图)。注册后,应用程序将传递到主视图,我希望在第二页中创建按钮。第二个视图也属于同一类,我通过 segue 连接 tham 并使用 '[self performSegueWithIdentifier:@"sg1" sender:sender];' 调用现在,我将如何在此页面上放置按钮?
  • 您能帮我了解如何在新视图中添加按钮吗?在用户帐户页面之后,我想将按钮放在第二个视图上,我将视图与 segue over identiier 连接起来。但现在这段代码对我不起作用。这是我得到的错误:'"_OBJC_IVAR_$_UIViewController._view",引用自:'编译器没有为 [view addSubView:] 提供错误,我不知道如何修复它
  • 我仍然无法得到结果。 [view addSubview:button] 有问题,我将其声明为 UIViewController *view;并准备了它的属性,但这次不接受具有 UIViewContrpller 的属性。请有人能给出任何想法,我也用谷歌搜索了结果,但什么也想不通。这两个视图属于同一类,一个视图用于用户帐户,另一个视图用于应用程序面板(我的意思是我要放置按钮的位置)
  • UIViewController 已经有 view 属性了,试试[self.view addSubview:button];
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多