我想创建UITableView的多个实例。我的视图控制器中有tabbar,在每个tabbar项目上我必须加载来自Web服务的数据的表视图。我使用storyboard创建了Tableview。
我不想使用UITabBarController。我想要做的就是使用单视图控制器和单个tableview。
我也很困惑。使用单视图控制器是好的,因为我需要的是更新tableview吗?在我看来,使用UItabbarcontroller是不必要的。
答案 0 :(得分:0)
根据您的要求。 Tab栏的最佳用例是同时处理和维护多个实例。想象一下,就像你在吃饭申请一样。对于每个选项卡,您必须显示tableview中加载的不同选项。这些选项卡保持不同的tableviews状态。维护单个视图控制器中的内容必须刷新并替换旧数据以将新数据放入图片中。这里每次都需要加载tableview数据。因此,根据您的要求考虑是否使用标签栏。如果您不想同时维护多个tableview的不同状态,请选择singleView Controller和Single Tableview。
答案 1 :(得分:0)
您只需维护UITableView
的单个实例,并使用标签栏选择来决定使用哪个数据源。这是一个工作示例,故事板中的视图控制器设置包含一个标签栏和一个表格视图。
#import "ViewController.h"
@interface ViewController () <UITableViewDataSource, UITabBarDelegate>
@property(weak,nonatomic) IBOutlet UITableView *tableView;
@property(weak,nonatomic) IBOutlet UITabBar *tabBar;
@property(strong,nonatomic) NSArray *model;
@end
我们的模型是三个数组,一个用于标签栏中的每个标签。这些数组在这里是硬编码初始化的,但也可以从Web服务初始化...
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *dataSource0 = @[ @"A", @"B", @"C" ];
NSArray *dataSource1 = @[ @"1", @"2", @"3"];
NSArray *dataSource2 = @[ @"doh", @"ray", @"me"];
self.model = @[ dataSource0, dataSource1, dataSource2 ];
self.tabBar.selectedItem = self.tabBar.items[0];
}
// the user pressed a tab, reload the table
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
[self.tableView reloadData];
}
// this is an important part: our data for the table is determined by
// which tab is selected, return of the arrays, corresponding to the selection
- (NSArray *)currentDataSource {
UITabBarItem *item = self.tabBar.selectedItem;
NSInteger index = [self.tabBar.items indexOfObject:item];
return self.model[index];
}
// these datasource methods always refer to the currentDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self currentDataSource].count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
NSString *text = [self currentDataSource][indexPath.row];
cell.textLabel.text = text;
return cell;
}
@end