同一个UIViewController中的两个UITableView

时间:2014-02-12 14:19:16

标签: ios objective-c uitableview

我试图在同一视图上有2个表视图。它们都在同一个UIViewController内,实现了UITableViewDelegateDatasource。其中一个tableviews是静态的,另一个是动态的。动态表视图使用其数据源中的方法正常加载,但静态表显示为空白。通常我会从控制器中删除数据源方法,因此静态TableView不会覆盖故事板上已经完成的操作,但现在我不能,因为动态TableView正在使用这些方法。

如何在同一控制器下同时使用两者?

3 个答案:

答案 0 :(得分:1)

正如Putz所说,您可以设置视图控制器来管理2个表视图,方法是设置数据源并委托方法来检查传入的表视图。

但是,我不认为除了UITableViewController之外,你可以使用静态表视图,而表视图控制器只知道如何管理单个表视图。

诀窍是向视图控制器添加2个容器视图,其中包含2个表视图,并在每个容器视图中嵌入不同的UITableViewController。然后每个表视图由它自己的表视图控制器管理。我在github上有一个项目就是这样做的:https://github.com/DuncanMC/test

我已经设置了父视图控制器和2个表视图控制器用于通信的协议,但如果您的需求更简单,则不必这样做。

答案 1 :(得分:1)

这是最简单的选项,让您为代理/数据源保留一个VC:

将tableviews委托和数据源设置为UIViewController

从其中一个静态单元格按Ctrl键拖动到.h文件,然后创建一个IBOutlet集合(此处称为staticCellsCollection)。将每个静态单元格添加到集合中,小心顺序,这很重要。

以这种方式实施cellForRowAtIndexPath:

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

    if (tableView == _dynamicTableView) {
        // Do your dynamic thing
    }

    else if (tableView == _staticTableView) {
        // Return the static cells one by one
        // Here the static TV has only one section, and all cells are in staticCellsCollection
        return staticCellsCollection[indexPath.row];
    }

}

您还需要调整numberOfRowsInSectionnumberOfSectionInTableView,但这非常基本(检查哪个表正在询问,并返回适当的值,例如staticCellsCollection.count表示行的行数静态电视)。

您可能需要对此进行调整,例如,如果您想在静态TableView中使用多个部分,则应为每个部分创建一个IBOutletCollection,并相应地处理行/部分的数量,并返回正确的单元格。无论如何,一旦你明白了,这就非常简单了。

答案 2 :(得分:0)

您可以让两个tableView使用相同的委托功能。这不是很漂亮,但你可以:

- (UITableViewCell *)tableView:(UITableView *)inTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(inTableView == tableView1)
    {
        ...
    }
    else if
        ...
}

将这种类型的逻辑放入每个tableView委托函数中。