在单个 UITableView 中具有多个 UITablesViewCells 的多个 UITableViewController

Posted

技术标签:

【中文标题】在单个 UITableView 中具有多个 UITablesViewCells 的多个 UITableViewController【英文标题】:Multiple UITableViewController with multiple UITablesViewCells in a single UITableView 【发布时间】:2014-06-02 03:26:56 【问题描述】:

我正在处理 iPad 应用程序中的列表显示。

我有一个屏幕,屏幕上有一个UISegmentedController 和一个UITableView

UITableViewControllers 每个都定义在一个类中,每个都有自己的 Delegate 和 DataSource 方法来访问和控制列表。有一个共享的超超类,以及定义的两个超类。

我以前在它们自己的屏幕中拥有列表,但希望将它们放在一个屏幕中并使用选择器在视图之间切换。

目前我已将代码设置为在UITableViews 之间切换并尝试显示数据,并让代码以正确的方法调用正确的函数,但在UITableView 中没有出现数据屏幕。

我确信我没有将一些“魔法”应用于该问题,但到目前为止我发现的任何示例中都没有“法术”。

如何在现有 TableView 中的 UITableViewController 和自己的 UITableViewCells 之间切换?

我正在尝试在 ios 5.1 中执行此操作,并使用 Xcode 4.6.3 作为开发环境。

【问题讨论】:

【参考方案1】:

您可以使用一个 UITableView 来显示所有数据。您可以使用 UIButtons 而不是使用 UISegmentedControl。在 UIButton 的 IBAction 中,您可以更改要显示的特定数据的 dataArray。喜欢

self.dataArray = array1;

[self.tableview reloadData];

并使用这个 dataArray 在你的 UITableView 方法中显示数据。

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

    return dataArray.count;

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

您可以使用我在我的一个应用中使用的不同方法。

#pragma mark - UITableView Delegate and DataSource

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

        if (btnFavourites.selected) 
            return arrFavourites.count;
        else if (btnHistory.selected)
            return arrHistories.count;
        else if (btnHome.selected)
            return arrAddresses.count;
        



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        static NSString *cellIdentifier = @"MyCell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
        if (!cell) 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        

        // Configure the cell...
        if (btnHome.selected) 
            Home *home = [arrAddresses objectAtIndex:indexPath.row];
            cell.textLabel.text = home.address;//[address valueForKey:@"address"];

        else if (btnFavourites.selected)
            Favourites *favourite = [arrFavourites objectAtIndex:indexPath.row];
            cell.textLabel.text = favourite.location;//[favourite valueForKey:@"address"];

        else if (btnHistory.selected)
            History *history = [arrHistories objectAtIndex:indexPath.row];
            cell.textLabel.text = history.location;// [history valueForKey:@"address"];

        


        return cell;


您可以根据您的要求进行定制。希望这可以帮助。谢谢。 :)

【讨论】:

关闭,但“没有香蕉”。对于每个列表,我有一个单独的类来完成字符串的整个工作,还有两个单独的 TableViewCell 方法用于单元格样式,它们在情节提要中都是“自定义”的。这是代码:[listViewController initalizeTableListData]; [self.listView setDataSource:listViewController]; [self.listView setDelegate:listViewController]; self.listView = listViewController.tableView; [listViewController.tableView reloadData];我接到“Delegate”和“DataSource”函数的调用,但显示屏显示一个空白列表,没有数据。【参考方案2】:

这是我用来“交换”UITableViews 的代码:

-(void)selectView:(NSInteger)selected

SectionListViewController *listViewController;

switch (selected) 
    default:
    case 0:  // Animal by Name
        listViewController = [[AnimalNameListViewController alloc] init];
        break;

    case 1:  // Animal by Breeder
        listViewController = [[AnimalBreederListViewController alloc] init];
        break;

    case 2:  // Animal by Owner
        listViewController = [[AnimalOwnerListViewController alloc] init];
        break;

    case 3:  // Animal by Breed
        listViewController = [[AnimalBreedListViewController alloc] init];
        break;

    case 4:  // Animal by RegOrg
        listViewController = [[AnimalRegOrgListViewController alloc] init];
        break;

    case 5:  // Breeder by Name
        listViewController = [[BreederNameListViewController alloc] init];
        break;


[listViewController initalizeTableListData];

[self.listView setDataSource:listViewController];
[self.listView setDelegate:listViewController];
self.listView = listViewController.tableView;

[listViewController.tableView reloadData];

它“几乎”有效。调用了 Class 中的 Delegate 和 DataSource 例程,但 View 中没有数据。

【讨论】:

listViewController 是 SectionListViewController 类的一个对象,你正在用其他类初始化(alloc init)它。甚至可能吗?我从来没有做过这样的事情。我不知道它是否甚至可能。是否调用了 initalizeTableListData 方法?您可以使用调试指针来检查您在哪里以及做错了什么。 好的,我们换个角度看问题。我有一个 UIListViewController 和一个 UIListViewCell ,我想在屏幕上的 UIListView 中显示它们。不使用情节提要执行此操作的“正确”方法是什么?耐心点。我对 Objective C 和 IOS 的了解大部分是从互联网博客中学到的。 UIListViewController???那是你的班级名称吗?它是从 UITableViewController 继承的吗?所以你真正想做的是创建一个 UITableView 并以编程方式显示内容。如果我是对的,请告诉我。 好的。我有一个名为 SectionListViewController 的超类,它基于 UITableListViewController。我有两个子类,分别称为 AnimalListViewController(使用 AnimalTableCell)和 BreederListViewController(使用 BreederTableCell)。每个子类都有子类。我在显示器中有一个 UISegmentedControl 来选择要显示的表格和一个 UITableView 来显示它。那么,如何在“表格”之间切换?我需要将 UITableListViewController 放到 UITableListView 吗?我的头上长了一个老茧! 您正在使用 .xib 作为 UI,因此您必须在选择特定段时分配 initWithNibName:。以及要显示的控制器视图的 setFrame。尝试使用这个。希望这会有所帮助。

以上是关于在单个 UITableView 中具有多个 UITablesViewCells 的多个 UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 中显示带有视频图像的视频文件?

Xamarin.iOS - 单个 UITableView 中的多个 XIB

具有自定义单元格和多节数组数据的 Swift UITableView

ios UITableview 单个单元格上的多个选择选项?

具有多个 UITableView(s) 的相同原型单元格

我可以将单个自定义单元格用于多个不同的单元格吗?