2

我对 iOS 开发还很陌生,我已经为此苦苦挣扎了大约一天,但不知道为什么它不起作用。我正在尝试将视图控制器中的表格视图用作用户使用的小菜单。我已经检查了 NSArray 是否正在被填充,并且确实如此。我还检查了是否正在创建单元格,并且确实如此。我只是想不通为什么它没有用它创建的单元格填充表格视图。以下是我到目前为止的代码。提前感谢任何人都可以提供的任何帮助。

主视图控制器.h

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITableView *menuTableView;
@property (weak, nonatomic) IBOutlet UIButton *menuButton;
@property (strong, nonatomic) NSArray *menuItemsArray;
@property (weak, nonatomic) IBOutlet UILabel *menuLabel;


@end

主视图控制器.m

#import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController
@synthesize menuItemsArray, menuTableView, menuButton, menuLabel;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{

    [super viewDidLoad];

    //Set TableView Delegate/DataSource to self
    [self.menuTableView setDelegate:self];
    [self.menuTableView setDataSource:self];
    [self.menuTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.menuTableView setBounces:NO];
    [self.menuTableView setRowHeight:self.menuLabel.frame.size.height];

    self.menuItemsArray = [[NSArray alloc] initWithObjects:@"Add Category", @"Add Item", @"Settings", nil];

    NSLog(@"array: %@", menuItemsArray);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

#pragma mark - UITableViewDelegate

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

    return ([self.menuItemsArray count]);
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"menuCell"];


    [[cell textLabel]setText:[self.menuItemsArray objectAtIndex:indexPath.row]];

    [[cell textLabel]setFont:[self.menuLabel font]];

    return cell;
}

-(void)tableView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [self.menuTableView deselectRowAtIndexPath:indexPath animated:YES];

    NSString *selectedString = [self.menuItemsArray objectAtIndex:indexPath.row];

    self.menuLabel.text = selectedString;

}
4

5 回答 5

1

我有同样的问题,我的表格视图没有显示在视图控制器中。我找到了解决方案。您可以创建另一个带有 Container 视图的视图控制器。并将您的表视图放在表视图控制器上。只需将表格视图控制器嵌入到您的邮件视图控制器的容器视图中。

于 2013-09-17T04:11:50.440 回答
0

这有点晚了,因为您已经找到了解决方法,但是我遇到了与您相同的问题,发现我需要将 IBOutlet 属性连接到情节提要中的表格视图,然后一切正常。

我希望这对您将来有所帮助。

于 2013-08-12T18:41:20.573 回答
0

确保initWithNib正在调用您的方法。如果您正在调用[[MainController alloc] init]您的“menuTableView”,则永远不会从 Nib 创建。backgroundColor此外,通过将主表视图设置为或其他内容来仔细检查表视图,[UIColor red]以确保 tableView 存在并且它具有您期望的框架。它可能位于您的其他视图之一的后面,具有 的框架(0,0,0,0),或者根本不存在于视图中。

还可以尝试[self.menuTableView reloadData]在“viewDidLoad”结束时调用或menuItemsArray在设置数据源和委托(即在您的initWithNib方法中)之前初始化。

当你真的让这一切正常工作(你非常接近)时,你会想要将你的cellForRow方法更改为更像这样的东西:

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

    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"menuCell"];
    if(!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"menuCell"];
    }

    [[cell textLabel]setText:[self.menuItemsArray objectAtIndex:indexPath.row]];

    [[cell textLabel]setFont:[self.menuLabel font]];

    return cell;
}

这将允许您利用使表格视图如此高效的单元重用。

于 2013-02-06T22:33:03.193 回答
0

所描述的症状的一个原因是,如果您使用情节提要中的容器视图将 UITableView 放置在父视图中,但是在代码中初始化和填充的 UITableView 实例与实际呈现给用户的实例不同。如果您使用容器视图将 UITableView 放置在视图中,则需要执行以下操作:

  • 通过从容器视图到 Storyboard 中的 UITableView 的 Control-Dragging,使用 segue 将 UITableView 连接到容器视图。
  • 单击segue,并为其命名,例如tableViewSegue
  • 通过实施设置表prepareForSegue:sender:

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    NSString * segueName = segue.identifier;
    if ([segueName isEqualToString: @"tableViewSegue"]) {
        UIViewController * myTableView = [segue destinationViewController];
        // Do any table setup here, such as injecting the data array into a property on the tableView.
        }
    }
    

相反,如果您一直在代码中创建不同的 UITableView,您将看到一个未填充的 UITableView,它遵循故事板中设置的规范(例如,行高间距将是正确的)并且响应用户交互,但它是空的. 空的是情节提要自动为您初始化的,同时您一直在其他地方创建另一个 UITableView:

// DON'T DO IT THIS WAY IF YOU'RE USING STORYBOARD.
- (void)viewDidLoad {
    [super viewDidLoad];

    // Incorrectly creating a tableview child table view that won't be the one presented.
    self.myTableView = [MYTableViewClass new];
    // ...further configuration of the table.
}

如果您遵循这条错误的路径,您正在创建的另一个 UITableView 正在内存中构建,并填充了您的数据数组,因此您将看到该进程中的所有 NSLog 语句,并能够在内存中看到具有正确编号的 UITableView当您逐步执行代码时,对象等等,但难以理解的是您没有看到呈现给用户的对象。所以追踪起来可能很棘手。:)

只需删除上面的代码,实施prepareForSegue:sender:,宇宙将恢复为可预测的地方。

于 2014-06-20T19:26:04.553 回答
0

如果在 UIViewController 内部添加 UITableView,则需要将 UITableView 的框架大小设置为与 UIViewController 内部视图的框架大小相同,否则 tableview 大小可能为 0,无法显示任何内容。

如果您在案例中通过情节提要创建 UITableView,则可以设置帧大小:

- (void)viewDidLoad {
        [super viewDidLoad];
        // Set tableview delegate and datasource here
        menuTableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
于 2016-10-03T03:30:07.117 回答