Динамически создавать переменные в цикле - PullRequest
0 голосов
/ 02 декабря 2011

Я пытаюсь создать цикл

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

Но это не работает

Причина в том, что, как только я создал представления в цикле, я хочу создать панель вкладок, в которой каждое представление является вкладкой, а затем каждая вкладка вызывает свой собственный контроллер представления

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

Спасибо

Bob

Ух ты - два фантастических и быстрых ответа.

К сожалению, я довольно новичок в Xcode и не тороплюсь. Я подумал, что если я отправлю полный код, это может помочь мне объяснить, что я пытаюсь сделать.

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

Суть в том, что я могу добавить элементы панели вкладок, но не могу получить элементы панели вкладок для создания новых таблиц.

Я знаю, что код является правильным для создания элементов панели вкладок - я могу добавить столько элементов панели вкладок, сколько захочу. Я знаю, что если я нарисую только один элемент панели вкладок, я смогу нарисовать таблицу

Но я не могу получить несколько элементов панели вкладок, чтобы нарисовать таблицу.

Я думал, что лучшим способом было бы динамически назвать контроллер представления, который вы, ребята, показали мне, невозможен.

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

Есть предложения?

Пожалуйста, если возможно, включите некоторые фрагменты кода - я начинаю понимать код, когда читаю его, но я не понимаю определения, которые объясняют (например, тег для контроллера представления)

Спасибо

Bob

- (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 голосов
/ 02 декабря 2011

Несколько способов решить эту проблему для вас ...

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

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

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

Другое, массивы упорядочены, так как при добавлении элементов к ним порядок остается неизменным, если вы не измените его явно, добавление элемента в изменяемый массив поместит этот элемент в конец, так что по сути вы знаете, какое представление является каким Вы знаете, когда вы добавили их в массив.

0 голосов
/ 02 декабря 2011

Вы не можете этого сделать, но то, что вы можете сделать, это сохранить ссылки в словаре и использовать их в другом месте, например:

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...