我有一个应用程序,它以任务列表开头,并通过一个或两个列表视图向下钻取到最终UIViewController
。由于项目要求,需要以编程方式创建和导航这些视图控制器,不通过Interface Builder中的segue 。我用单个列表和常规视图控制器完成了这个,但有一个案例让我感到难过。
我目前在Interface Builder中有几个UITableViewControllers
指向其他UITableViewControllers
,基本上是一个下钻列表。我不确定如何在我的UITableViewController
中创建一个列表项,创建另一个UITableViewController
填充我发送的列表项,然后导航到它。
我需要UITableViewController
是通用的,因此我可以使用相同的UITableViewController
代码创建多个向下钻取列表。
这有意义吗?我觉得它应该是一件简单的事情,但我的大脑还没有就如何建立联系。
编辑:让我试着更好地说明我的问题。我的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);
obj1.address=@"Address";
obj1.imgName=@"XXXYY.jpg";
obj1.menuIndex=0;
obj1.typeFlag=@"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 :(得分:1)
你也可以用segues做到这一点。只需制作一个&#34;虚拟segue&#34;从一个条形按钮项目返回到视图控制器本身。
见此截图:
然后你可以通过编程方式触发这个segue - 即当在表视图中点击一个单元格时 - 来制作一个&#34;无限的&#34;同一个视图控制器的堆栈。
如果你不想要segues。只需以编程方式创建视图控制器,然后手动将其推送。同样的&#34;重用&#34; -concept适用于此。
答案 1 :(得分:0)
声明一个UITableViewController类型的类。 在它的.h文件中,声明一个NSArray来保存数据。
在.m文件中,使用数组作为数据源,实现tableview委托和数据源方法。
在你的调用tableViewController中,在tableView:didSelectRowAtIndexPath:中, 创建tableviewController类的新实例, 然后将它的数组设置为要传递它的项目列表, 并推动它:
[self.navigationController pushViewController:_the_new_instance_ animated:YES];
答案 2 :(得分:0)
我最终在我的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];
}
}
Dim TransporterI As Integer
For TransporterI = 2 To rowCount + 1
'Open Gauge Reading
Sheet1.Cells(TransporterI, 11).Value = Format(Sheet3.Cells(TransporterI, 37),"00") & "-" & Format(Sheet3.Cells(TransporterI, 38),"00") & "-" & Format(Sheet3.Cells(TransporterI, 39),"00") & "/04"
Next TransporterI