2015-06-23 3 views
1

У меня есть приложение, которое начинается со списка задач и сверлит вниз через один или два вида списка до окончательного UIViewController. Из-за требований проекта эти контроллеры представлений должны создаваться и программно программироваться, не через segues в Interface Builder. Я сделал это с помощью отдельных списков и обычных контроллеров, но в одном случае я был в тупике.Как программно создавать и заполнять вложенные UITableViewControllers?

В настоящее время у меня есть несколько UITableViewControllers в Interface Builder, которые указывают на другие UITableViewControllers, в основном сводный список. Я не знаю, как создать элемент списка в моем UITableViewController, который создает еще один UITableViewController, заполненный элементами списка, которые я отправляю, а затем переходит к нему.

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

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

EDIT: Позвольте мне попытаться лучше проиллюстрировать мою проблему. Мой UITableViewController содержит элементы списка, которые ему переданы, и массив объектов, связанных с этими элементами. UITableViewController использует эти объекты для создания окончательного экрана UIViewController в большинстве случаев.

TableVC.h

@interface TableVC : UITableViewController <UITableViewDataSource, UITableViewDelegate> 

//Menu items 
@property NSMutableArray *itemList; 

//Objects to pass to the detail ViewController 
@property NSMutableArray *itemObjectList; 

- (void)initWithList:(NSMutableArray *)items :(NSMutableArray *)objects :(NSString *)title; 

@end 

TableVC.m

NSMutableArray *items = [NSMutableArray arrayWithObjects: 
         NSLocalizedString(@"List Item 1",nil), 
         NSLocalizedString(@"List Item 2",nil), nil]; 

NSMutableArray *objects = [[NSMutableArray alloc]init]; 

MenuListObject *obj1 = [[MenuListObject alloc]init]; 
obj1.name =NSLocalizedString(@"Name",nil); 
obj1.department=NSLocalizedString(@"Department",nil); 
[email protected]"Address"; 
[email protected]"XXXYY.jpg"; 
obj1.menuIndex=0; 
[email protected]"F"; 

... 

[objects addObject:obj1]; 
[objects addObject:obj2]; 

TableVC *vc = [[TableVC alloc]init]; 
[vc initWithList:items :objects :NSLocalizedString(@"My Title",nil)]; 

[self.navigationController pushViewController:vc animated:YES]; 

Однако в некоторых случаях элементы списка не идут к UIViewController. Вместо этого они ведут в другой список, который затем заканчивается на UIViewController. я знаю как создать элементы списка, но не элемент списка, который ведет к другому UITableViewcontroller.

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

+0

«Из-за характера приложения эти контроллеры представлений должны быть созданы и перемещаться программно, а не через segues в Interface Builder». Я ничего не вижу в вашем описании, которое невозможно сделать в раскадровке. Вы можете сделать это с помощью segues. – ullstrm

ответ

1

Вы можете сделать это с помощью segues. Просто сделайте «фиктивный переход» от элемента кнопки панели обратно к самому контроллеру представления.

Смотрите этот скриншот:

enter image description here

Затем вы можете запустить этот SEGUE программно - то есть при касании ячейку в виде таблицы - сделать «бесконечный» стек одного и того же контроллера представления.


И если вы не хотите segues. Просто создайте контроллер просмотра программно и нажмите его вручную. Здесь применяется одно и то же «повторное использование».

0

Объявите класс типа UITableViewController. В файле .h, объявите NSArray для хранения данных.

В файле .m, реализуйте методы делегата tableview и источников данных, используя массив в качестве источника данных.

В вашем вызывающему tableViewController, в Tableview: didSelectRowAtIndexPath :, создать новый экземпляр класса tableviewController, затем установить его массив в список пунктов, которые Вы хотите передать его, и толкать его:

[self.navigationController pushViewController:_the_new_instance_ animated:YES]; 
+0

У меня на самом деле был код, который сделал это - в итоге просто добавился к этому. Спасибо за напоминание. – CountVonCounty

0

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
MenuListObject *obj = nil; 

for (int i=0; i<self.itemObjectList.count; i++){ 
    obj = [self.itemObjectList objectAtIndex:i]; 
    if (obj.menuIndex == indexPath.row){ 
     break; 
    } 
} 

if (obj!=nil) 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 

if ([obj.typeFlag isEqualToString:@"F"]) 
{ 



    if (obj.url ==nil) 
    { 

     FacilityDetailVC *vc = [storyboard instantiateViewControllerWithIdentifier:@"FacilityDetail"]; 

     vc.name=obj.name; 
     vc.department=obj.department; 

     ... 


     [self.navigationController pushViewController:vc animated:YES]; 
    } 
    else if ([obj.typeFlag isEqualToString:@"T"]) 
    { 
     TextDetailVC *vc = [storyboard instantiateViewControllerWithIdentifier:@"TextDetail"]; 

     vc.titleText=obj.titleText; 
     vc.descriptionText=obj.descriptionText; 
     vc.URL=obj.url; 

     [self.navigationController pushViewController:vc animated:YES]; 

    } 
//This is the part I added, to redirect to the UITableViewController 
    else if ([obj.typeFlag isEqualToString:@"L"]) 
    { 
    TableVC *vc = [[TableVC alloc]init]; 
     [vc initWithList:obj.listItems :obj.listObjects :obj.titleText]; 

     [self.navigationController pushViewController:vc animated:YES]; 

    } 
} 
Смежные вопросы