在单个 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
。
UITableViewController
s 每个都定义在一个类中,每个都有自己的 Delegate 和 DataSource 方法来访问和控制列表。有一个共享的超超类,以及定义的两个超类。
我以前在它们自己的屏幕中拥有列表,但希望将它们放在一个屏幕中并使用选择器在视图之间切换。
目前我已将代码设置为在UITableView
s 之间切换并尝试显示数据,并让代码以正确的方法调用正确的函数,但在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