2013-02-06 150 views
2

我对iOS开发相当新,我一直在为这个问题的解决方案摔跤大约一天,并不知道为什么它不工作。我正在尝试在viewcontroller中使用tableview作为供用户使用的小菜单。我已经检查过NSArray是否被填充,而且是。我也检查过这个单元格是否被创建,它是。我只是不明白为什么它不会为它创建的单元格填充tableview。以下是我迄今为止的代码。预先感谢任何人都可以提供的帮助。ViewController中的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; 

} 
+0

什么行的高度被设置为:

,如果你在你的情况下,通过创建故事板的UITableView您可以设置帧的大小? –

+0

当前行高为44 – Luis

+0

您可以使用“现代”的Objective-C语法吗?随着代码越来越少,这会更容易,例如:cell.textLabel.text = self.menuItemsArray [indexPath.row];检查Xcode菜单编辑 - 重构 – JOM

回答

0

确保您initWithNib方法被调用。如果你打电话[[MainController alloc] init]你的“menuTableView”将永远不会从Nib创建。此外,通过将主表格视图的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; 
} 

这将允许你采取细胞再利用的优点这使得表格视图如此高效。

+0

感谢您的回复。我一直在尝试使用Storyboard,但它一直没有工作。我转而使用.xib文件,而且它工作得很好。关于为什么它在一个而不是另一个上工作的任何想法? – Luis

+0

对不起,我想我是老派。我不使用故事板来避免这些类型的情况。真高兴你做到了。 –

0

这是有点迟了,因为你找到了解决办法,但我遇到了同样的问题,并发现我需要将IBOutlet属性连接到故事板中的表视图,然后才能正常工作。

我希望这可以帮助你在未来。

0

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

0

描述症状的一个原因是,如果您已经在故事板中使用容器视图将UITableView放置在父视图中,但在代码中初始化和填充了实际呈现的UITableView的不同实例给用户。如果您使用的容器视图放置在视图中的UITableView的,那么你需要做到以下几点:

  • 的UITableView的连接到容器视图与SEGUE,从容器视图控件拖动到的UITableView在故事板中。
  • 点击赛格,并为其命名,例如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:和宇宙将返回到一个可预测的地方。

0

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

- (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); 
} 
相关问题