带有多个表视图的选项卡式 ios 应用程序

Posted

技术标签:

【中文标题】带有多个表视图的选项卡式 ios 应用程序【英文标题】:Tabbed ios application with multiple table views 【发布时间】:2012-06-25 19:21:28 【问题描述】:

我正在使用 XCode 4.2 并在 iPad 5.0 上测试我的构建。

我开始使用 XCode 中的标准选项卡式应用程序构建一个应用程序,然后添加代码以在第一个选项卡内有 2 个 uitableviews。

它编译,但表数据没有加载到视图中。

应用委托.h:

@interface dmbAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UITabBarController *tabBarController;

@end

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    UIViewController *viewController1 = [[[dmbFirstViewController alloc] initWithNibName:@"dmbFirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[dmbSecondViewController alloc] initWithNibName:@"dmbSecondViewController" bundle:nil] autorelease];
    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
    NSLog(@"Loading first tab view from app delegate...");
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

FirstViewController.h:

@interface dmbFirstViewController : UIViewController 

    ReservationsTable *reservationsController;
    WaitlistTable *waitlistController;
    IBOutlet UITableView *reserveTable;
    IBOutlet UITableView *waitlistTable;

FirstViewController.m:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:reservationsController];
    [waitlistTable setDataSource:waitlistController];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:reservationsController];
    [waitlistTable setDelegate:waitlistController];
    reservationsController.view = reservationsController.tableView;
    waitlistController.view = waitlistController.tableView;

    NSLog(@"FirstView Controller - View Loading Finished");

这两个表都有一个 .h 和 .m 并实现了标准表方法。我还在第一个视图 nib 文件中添加了 2 个表,并将它们链接到文件所有者。

更新: ReserveTable.h:

    @interface WaitlistTable : UITableViewController <UITableViewDataSource, UITableViewDelegate>
        NSMutableArray *waitlistitems;
    

ReserveTable.m:

- (void)viewDidLoad

    NSLog(@"View Did Load - Wait List Table");
    waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    NSLog(@"Inside number of section for Wait List table...");
    return 1;


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

    NSLog(@"Inside numberofRows for Wait List table...");
    // Return the number of rows in the section.
    return [waitlistitems count];


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

    NSLog(@"Inside cell for row at index path for Wait List table...");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    

    // Configure the cell...
    cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];    
    return cell;

想法?

【问题讨论】:

reservationsController 和 waitListController 的代码是什么样的?它们在哪里初始化? 在上面的问题中添加了waitlist控制器的代码。 【参考方案1】:

将您的 viewDidLoad 更改为:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    reservationsController = [[ReservationsTable alloc] init];
    waitlistController = [[WaitlistTable alloc] init];

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:reservationsController];
    [waitlistTable setDataSource:waitlistController];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:reservationsController];
    [waitlistTable setDelegate:waitlistController];

    NSLog(@"FirstView Controller - View Loading Finished");
 

基本上,你永远不会初始化你的tableViewControllers(我猜这是他们两个的名字,我会把他们的名字改成“WaitlistTableViewController”和“ReservationsTableViewController”,但那只是我。)另外,没有必要将 'tableView' 设置为 'view'。

或者更好的是,在您的 dmbFirstViewController 的 init 方法中初始化它们。

或者像这样使用dmbFirstViewController

dmbFirstViewController.h:

@interface dmbFirstViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

    ReservationsTable *reservationsController;
    WaitlistTable *waitlistController;
    IBOutlet UITableView *reserveTable;
    IBOutlet UITableView *waitlistTable;
    NSMutableArray *waitlistitems;
    NSMutableArray *reserveitems;

dmbFirstViewController.m:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];

    NSLog(@"FirstView Controller - View Loading Started");

    [reserveTable setDataSource:self];
    [waitlistTable setDataSource:self];

    NSLog(@"FirstView Controller - Loading Table Views..");

    [reserveTable setDelegate:self];
    [waitlistTable setDelegate:self];

    NSLog(@"FirstView Controller - View Loading Finished");


- (void)viewDidAppear:(BOOL)animated

    [reserveTable reloadData];
    [waitlistTable reloadData];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    NSLog(@"Inside number of section for Wait List table...");
    if(tableView == waitlistTable)
    
        //Return sections for waitlistTable
        return 1;
    else
        //Return sections for reservedTable
        return 1;
    


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

    if(tableView==waitlistTable)
    
        NSLog(@"Inside numberofRows for Wait List table...");
        // Return the number of rows in waitlistTable section.
        return [waitlistitems count];
    else
        // Return the number of rows in reservedTable section.
        return [reserveditems count];
    


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


    if(tableView == waitlistTable)
     
        NSLog(@"Inside cell for row at index path for Wait List table...");
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) 
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        

        // Configure the cell...
        cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];    
        return cell;
     else 
        //Create cell for reservedTable Cell
        .....
        return cell;
    

你必须完成关于reservedTable 单元格的部分,我没有那个代码。另外,我猜到了 reservedTable 的 items 数组并没有初始化它。

【讨论】:

我重构了类的名称,并添加了您的代码来初始化它们。还是不行。 我的最后一点建议是在视图出现后尝试重新加载数据。在viewDidAppear: 方法中尝试[reserveTable reloadData]; [waitlistTable reloadData]; dmbFirstViewController 或者,如下所述,使用dmbFirstViewController 作为datasourcedelegate 用于UITableViews。如果您需要这样做的帮助,我可以发布代码。 我试过 reloadData 还是不行。我认为这些表没有连接到它们的数据源。 好的,你能给我看一些示例代码,让两个表的代码在同一个视图中吗?【参考方案2】:

我认为在您的firstViewController 中您应该推送意见。 假设reserveTable 是你的主表,就这样推吧

[self.view addSubView:reserveTable];

另外,您是否将ReserveTable.h 导入到您的firstViewController

如果是,你应该在那里初始化表格。

但我建议将firstViewController 转换为tableViewController,编辑App Delegate 和firstViewController.h 和m,然后从那里初始化表(甚至添加另一个表)。这样会更容易!

【讨论】:

是的,我确实在我的 firstviewcontroller 头文件中导入了可重置类。 如果我想将firstviewcontroller转换为table view controller,我该如何加载两个不同的table呢? 尝试将其更改为tableViewController。只需将您在reserveTable 中的方法放入firstViewController 先用一张桌子试一试,一直在崩溃……正在努力。 感谢 Pheel,您将 firstViewController 转换为 tableViewController 的解决方案有效且更容易!

以上是关于带有多个表视图的选项卡式 ios 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 的选项卡式应用程序,每个选项卡上都有不同的主从表视图

带有 Xcode 6 的 iOS 8:PSCollectionView 不可滚动且单元格不可使用选项卡式应用程序选择

带有选项卡式导航的 Cocoa-Touch 后退按钮

我有一个选项卡式视图,如何触发视图运行一些代码,视图由选项卡式视图激活?

在选项卡式应用程序的导航视图中为表格添加背景图像

具有单个选项卡形式的多个表