2012-11-16 76 views
1

我需要以编程方式从现有视图中显示UITableViewController。以编程方式将UITableViewController添加到当前视图

我有一个MyAppViewController和它的视图上的按钮应该打开一个新的UITableViewController。但我似乎无法让它工作到目前为止。这里的UITableViewController的样子:

@interface SecondViewController : UITableViewController{} 

,并在主视图我使用添加表格视图控制器中的以下内容:

SecondViewController vc2 = [[SecondViewController alloc] init]; 
vc2.view.frame = {...} 
[self.view addSubview: vc2.view]; 

这是我通常会添加一个简单的视图控制器,所以我想的UITableViewController是一样的。

我得到的结果是整个屏幕上的空单元格。这是因为我假设代表没有设定,但我会在哪里设置?所以我的困惑是UITableViewController视图控制器上的委托设置者,并从主视图控制器视图中正确显示UITableViewController。

+1

有点困惑,你问如何添加一个'UITableViewController'或如何设置单元格的内容为'UITableView'? – Steven

+0

如何添加UITableViewController ...如果我成功地做到了这一点我认为我将能够处理单元格内容 – Vad

+0

@Vad:你在使用故事板吗? – GeneralMike

回答

4

编辑

这个答案已经过时。将视图控制器的视图添加为另一个视图控制器的子视图的正确方法是实现一个容器视图控制器。

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

原来的答案

你的模式是有点与众不同。执行您所描述的最常见的方法是初始化并呈现SecondViewController。如果这实际上是您想要的,我强烈建议您仔细阅读Apple的文档,了解如何创建,定制和呈现UIViewControllerUITableViewController

如果你知道这一切,并真的想做一些自定义然后阅读。

相反,您正在创建SecondViewController的实例,而不是呈现它,您将它的视图添加到当前视图控制器视图。如果你知道你想要完成什么,而这实际上是你想要的结果,那就去做吧。

有多种方法来配置这种通用模式。在这个例子中,我将坚持最简单的方式。

1)MainViewController(MVC)只要需要,应该将SecondViewController(SVC)实例保留在属性中。

2)SVC是UITableViewController子类,所以在默认情况下,它被设置为dataSourcedelegate为它的UITableView。这意味着您需要在SVC中实现UITableViewDataSourceUITableViewDelegate方法,以便为表填充数据。假设MVC知道需要进入表格的数据,它应该将其传递给SVC。最简单的方法是定义SVC上的属性,可以在初始化时在MVC中设置属性。

3)假设有一种方法可以在表格呈现后关闭表格,那么您需要MVC来做到这一点。基本上,MVC会从它的超级查看中删除SVC的视图,然后将SVC属性设置为零。

这是一些快速伪代码。我以最低限度作为例子。

// MainViewController.h 
// 
#import "SecondViewController.h" 

@interface MainViewController : UIViewController 
@property (nonatomic, strong) SecondViewController *svc; 
@end 

// MainViewController.m 
// 
#import "MainViewController.h" 

@implementation MainViewController 

// init and configure views w/ init, loadView, viewDidLoad, etc 

// present SecondViewController 
- (void)presentSecondViewController:(id)sender { 
    self.svc = [[SecondViewController alloc] init]; 
    // this example uses an array as the SVC data 
    self.svc.tableData = @[@"first", @"second", @"third", @"fourth"]; 
    self.svc.view.frame = self.view.bounds; 
    [self.view addSubview:self.svc.view]; 
} 

// dismiss SecondViewController 
- (void)dismissSecondViewController:(id)sender { 
    if (self.svc) { 
     [self.svc.view removeFromSuperview]; 
     self.svc = nil; 
    } 
} 

// SecondViewController.h 
// 
@interface SecondViewController : UITableViewController 
@property (nonatomic, strong) NSArray *tableData; 
@end 

// SecondViewController.m 
// 
@implementation SecondViewController 

// init and configure views w/ init, loadView, viewDidLoad, etc 

// override tableData getter to create empty array if nil 
- (NSArray *)tableData 
{ 
    if (!tableData) { 
     _tableData = @[]; 
    } 
    return _tableData; 
} 

// override tableData setter to reload tableView 
- (void)setTableData:(NSArray *)tableData 
{ 
    _tableData = tableData; 
    [self.tableView reloadData]; 
} 

// implement UITableViewDelegate and UITableViewDataSource methods using 
// the self.tableData array 
+0

你说得对。我不需要@interface SecondViewController:UIViewController 就像许多人所说的那样。 – Vad

0

这里是代码

1)添加数据源和代表.h

2).m

thisTableView = [[UITableView alloc] initWithFrame:CGRectMake(6.5, 60,  self.view.bounds.size.width - 10, 350) style:UITableViewStylePlain]; 

    [thisTableView setBounces:NO]; 
    thisTableView.backgroundColor = [UIColor whiteColor]; 

thisTableView.delegate = self; 
thisTableView.dataSource = self; 
[self.view addSubview:thisTableView]; 
    [thisTableView release]; 
+0

这个tableview如何知道它属于SecondViewController? – Vad

+0

@Vad其实你应该清楚你的要求,因为你说你需要在按钮上点击创建'TableView'。在这里你可以做的是,正如我所说的如何在SecondViewController中创建tableView并在按钮上点击导航到那个secondViewController或呈现该模式的视图。因此,您需要将该代码放入'Second ViewController'中,并且必须在这些方法内部编写一些代码才能正常工作。 – Kamarshad

+0

对不起,但我的SecondViewController已经是一个UITableViewController。出于某些原因,我宁愿保持这种方式。基于这个,你的第一个代码是有效的:** UIViewController **或者我应该保留它作为UITableViewController Vad

0

在你的头,你得告诉你的视图控制器创建一些代码符合UITableViewDataSource和UITableViewDelegate。 “的UIViewController”之后添加这种权利

<UITableViewDataSource, UITableViewDelegate> 

然后在实现文件中,你需要添加的委托和数据源的方法如表:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

而且

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

您可以在UITableViewDataSourceUITableViewDelegate类参考中找到完整列表。

此外,如果你的Alloc初始化你需要它的委托和数据源设置为当前类的表视图:

[myTableView setDelegate:self]; 
[myTableView setDataSource:self]; 
+0

我是否需要考虑到我的SecondViewController已经是一个UITableViewController? – Vad

0

好吧,首先,我想你与[self.view addSubview]做的是打桩项目中的所有观点在同一视图控制器,在更传统的方式来做到这一点是驳回当你是一个视图控制器完成它并自行创建新的视图控制器。你所做的打击是非常规的,我认为将来谁试图看你的代码会导致误导。另外,如果你真的开始尝试做标准的导航,那将是一件令人头疼的事情。此外,它看起来像一个内存管理噩梦(虽然我承认我仍然有点模糊,所以我不知道ARC是否会为你清理它,如果你真的使用ARC)。也就是说,有些情况下你可能会试图做到这一点 - 但如果你不确定,那就意味着你不想做什么(如果是你想做的事情,请查看XJones的答案)。我认为你正在寻找的是presentViewController - 这是更传统的方式来摆脱不需要的控制器,并用新的控制器替换它。摆脱

vc2.view.frame = {...} 
[self.view addSubview: vc2.view]; 

[self presentViewController:vc2 animated:/*YES or NO, try them both and use whichever one you like better*/ completion:NULL]; 

注意替换它:我不能完全肯定completion做什么(我想这也许可以让你一次VC2建成运行一个额外的方法 - 有是一些例子,如果你谷歌“presentViewController示例”,你可以看看获取更多的信息,或检查Apple Docs)。我知道保持它NULL将工作,并可能做你需要的。一旦你完成了所有这些,你将马上回到你现在所在的位置,在那里你将会看到一堆空单元格的视图(但你会以更传统的方式得到它)。

从这里,你需要添加一些代码到你的SecondViewController.m来告诉它你想展示什么。通常,您将有一个字符串数组,并且您希望表格的第一个单元格具有显示该数组中第一个字符串的标签,第二个单元格显示第二个字符串等等。要做到这一点,你会有类似cell.textLabel = [myArray objectAtIndex:indexPath.row];的东西。

设置一个UITableViewController比我在这篇文章中介绍的还要多,所以看看YouTube上的一些教程,或者别的什么,因为他们已经花时间在一个更易理解的地方解释你需要的一切了格式(当我第一次使用表格视图时,我发现this one非常有用,但也有其他人)。

相关问题