ViewController中的TableView不显示单元格

时间:2013-02-06 19:56:26

标签: ios uitableview tableview

我对iOS开发相当陌生,我现在已经为此解决了大约一天的问题,并且无法弄清楚它为什么不起作用。我试图在viewcontroller中使用tableview作为用户使用的小菜单。我已经检查过是否正在填充NSArray,它是。我还检查过是否正在创建单元格。我无法理解为什么它没有用它创建的单元格填充tableview。下面是我到目前为止的代码。提前感谢任何人提供的任何帮助。

MainViewController.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

MainViewController.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;

}

5 个答案:

答案 0 :(得分:0)

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

还可以尝试在“viewDidLoad”结束时调用[self.menuTableView reloadData]或在设置数据源和委托之前初始化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;
}

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

答案 1 :(得分:0)

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

我希望将来可以帮助你。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

  • 使用segue将UITableView连接到容器视图,通过Control-Dragging从容器视图连接到Storyboard中的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:,宇宙将返回到可预测的位置。

答案 4 :(得分: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);
}