【问题标题】:Tabbed ios application with multiple table views带有多个表视图的选项卡式 ios 应用程序
【发布时间】: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控制器的代码。

标签: objective-c ios ipad uitableview uitabbarcontroller


【解决方案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 的解决方案有效且更容易!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2011-03-29
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多