xCode动态创建ViewControllers

时间:2012-06-25 14:17:13

标签: objective-c xcode uiviewcontroller

我希望能够基于JSON文件动态创建ViewControllers。我的意思是,将有一个json将决定用户需要多少ViewControllers。即我说我有一个json文件,它可以显示5个ViewControllers,我希望能够动态创建这些ViewControllers并能够在它们之间进行转换。

所以我要的是JSON文件,它设置了ViewControllers,例如3。这个JSON文件包含文本,按钮等信息以及如何在它们之间导航。

所以我希望能够遍历这个JSON,并创建必要的视图控制器并添加所需的文本,按钮等。JSON还将指示视图控制器如何连接在一起

我知道如何创建一个VC并添加这样的信息(这只是一个简单的例子,只是创建了vc并添加了标签。

    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor whiteColor];

    UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(220, 50, 130, 80)];
    testLabel.backgroundColor = [UIColor clearColor];
    testLabel.textColor = [UIColor blackColor];
    testLabel.text = @"Hello";;

    [vc.view addSubview:testLabel ];
    [self.navigationController pushViewController:vc animated:YES];

我不知道如何使用JSON在循环中创建几个不同名称的ViewControllers。任何人对如何做到这一点都有任何想法?或者这样的事情是否可能?

非常感谢任何协助。

编辑:

JSON的基本示例

{
   "ViewControllers":[
      {
         "name":"FirstVC",
         "id":1
      },
      {
         "name":"SecondVC",
         "id":2
      },
      {
         "name":"ThirdVC",
         "id":3
      }
   ]
}

因此,第一个VC链接到secondVC,第二个VC链接到第三个VC

3 个答案:

答案 0 :(得分:2)

只需创建一个数组并将它们保存在那里。像这样:

NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithCapacity:0];

// ...
// Inside a loop
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor whiteColor];

UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(220, 50, 130, 80)];
testLabel.backgroundColor = [UIColor clearColor];
testLabel.textColor = [UIColor blackColor];
testLabel.text = @"Hello";

[viewControllers addObject:vc];
// Release vc and label if you're not using ARC

现在,如果你想命名你的控制器,一个想法是创建一个UIViewController的子类并添加一个name(或类似的东西)属性。然后你只需在循环中设置这个属性,你就可以根据该属性进行引用/过滤。

答案 1 :(得分:1)

您不会将它们显式地命名为单独的变量,而是您可能拥有不同UIViewController实例的NSArray。在阅读JSON文件时,您可以循环显示所显示的信息,创建视图控制器并在每次JSON告诉您时将其添加到数组中。完成后,您可以在用户来回导航时将视图控制器拉出阵列。

你的JSON是什么样的?发布示例,我们可以提供更多信息。

答案 2 :(得分:1)

为什么ViewControllers需要不同的名称?您应该只创建一个viewController类的实例。

例如,如果你有一个来自JSON的3“屏幕”:

  1. 第二
  2. 所有这些都有不同的按钮,文本等。你有一个类名MyViewController。如果你想区分你的屏幕,这个类可能有一个@property名称,@ property按钮(可能是NSArray和你的按钮管理类中的对象)等。

    接下来,您应该将对象(MyViewController类对象)存储在NSArray中。

    那么在应用启动时您想要做什么: 您创建了MyViewController类的对象并显示它。如果用户想要进入第二个屏幕,您应该只创建同一个类的另一个实例。

    因此,如果要显示屏幕名称,则ViewController类中的值为self.name