在循环中动态创建变量

时间:2011-12-02 00:32:16

标签: iphone xcode variables loops dynamic

我正在尝试创建一个循环

for (int i = 0; i < [tabNumbers count]; i++) 
{
    UIViewController *viewController;
    viewController = [[UIViewController alloc]  init];
    viewController.title = [tabNumbers objectAtIndex:i];
    viewController = [tabNumbers objectAtIndex:1];

    [viewControllersList addObject:viewController];
    [viewController release];
}

但问题是,当我添加视图数组时,我会得到一堆具有随机名称的视图控制器。

而不是

UIViewController *viewController;

我正在尝试做这样的事情

UIViewControlller *[NSString stringWithFormat:@"%@Controller",[tabNumbers objectAtIndex:i]]

但这不起作用

原因是,一旦我在循环中创建了视图,我就会创建一个标签栏,每个视图都作为选项卡,然后每个标签调用自己的视图控制器

我目前无法调用视图控制器,因为我不知道每次都会生成什么随机数。

由于

鲍勃

哇 - 两个奇妙而迅速的回应。

不幸的是,我对Xcode很陌生,而且我很慢。我想如果我发布了完整的代码,它可能有助于解释我想要做的事情。

因此,用户可以根据需要添加,删除,移动或重命名标签栏项目。

我要点是我可以添加标签栏项目,但无法获取标签栏项目来创建新表格。

我知道制作标签栏项目的代码是正确的 - 我可以添加任意数量的标签栏项目。 我知道,如果我只绘制一个标签栏项目,我可以让表格绘制

但我不能做的是获得多个标签栏项目来绘制表格。

我认为最好的方法是动态命名视图控制器,你们已经向我们展示过这是不可能的。

所以接下来的想法就是尝试从数组中获取它,但考虑到数组也会根据用户制作标签栏的名称而改变,我看不出它是如何工作的。

有什么建议吗?

请尽可能包含一些代码片段 - 我在阅读时开始理解代码,但我不理解解释的定义(例如视图控制器的标记)

由于

鲍勃

- (void)showTabBar 
{
GuidelinesAppDelegate *AppDelegate = (GuidelinesAppDelegate *)[[UIApplication sharedApplication] delegate];
NSMutableArray *viewControllersList = [[NSMutableArray alloc] init];
NSMutableDictionary *tabItemsDict = [[NSMutableDictionary alloc] initWithObjects:tabNumbers forKeys:tabNumbers];
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"data.plist"];

UIViewController *viewController;
for (int i = 0; i < [tabNumbers count]; i++) 
{
    viewController = [[UIViewController alloc]  init];
    viewController.title = [tabNumbers objectAtIndex:i];
    [viewControllersList addObject:viewController];
    [viewController release];
}

AppDelegate.tabItemsDict = tabItemsDict;
[self.tabBarController setViewControllers:viewControllersList animated:YES];

for (NSString *s in viewControllersList)
{
    RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];        
    NSMutableDictionary *tabTableStructureDict = [[NSMutableDictionary alloc] initWithContentsOfFile:DataPath];
    AppDelegate.tabTableStructureDict = tabTableStructureDict;

    UINavigationController *bNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.navigationController = bNavigationController;
    [self.view addSubview:[navigationController view]];

    [bNavigationController release];
    [rootViewController release];
}

}

2 个答案:

答案 0 :(得分:0)

你不能这样做,但你可以做的是将引用存储在字典中,并在其他地方使用它,如下所示:

NSMutableDictionary *controllers = [NSMutableDictionary dictionary];

for (int i = 0; i < [tabNumbers count]; i++) 
{
    UIViewController *viewController = [[UIViewController alloc]  init];
    viewController.title = [tabNumbers objectAtIndex:i];
    [controllers setValue:viewController forKey:[NSNumber numberWithInt:i];
    [viewController release];
}

答案 1 :(得分:0)

有几种方法可以解决这个问题......

首先,忘记给视图控制器一个带有随机名称的强引用的想法,这不是必需的。

UIView有一个标记属性,用于标识视图。在创建视图时将标记属性分配给视图并将其添加到数组中。然后,您可以通过对阵列进行过滤或迭代来了解标记号,从而再次获取该视图。

另一种方法是使用字典,其中键是视图的编号,值是视图本身。因此,通过这种方式,您可以通过使用键获取值来获取视图。

另一个,数组是有序的,当你向它们添加项目时,顺序保持不变,除非你明确修改它,将一个项目添加到一个可变数组会将该项目放在最后,所以你自己知道哪个视图是哪个你知道什么时候将它们添加到数组中。