我对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;
}
答案 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放置在视图中,则需要执行以下操作:
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);
}