我有一个带有 tableView 的类。我没有收到任何构建错误,但是当我尝试运行该应用程序时,在添加新项目后,似乎没有发生任何事情。这是代码:
在.h
@interface entriesViewController : UIViewController <UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *TableView;
-(IBAction)startEditing:(id)sender;
-(IBAction)newItem:(id)sender;
@end
在.m
#import "entriesViewController.h"
#import "LEItemStore.h"
#import "LEItem.h"
@interface entriesViewController ()
@end
@implementation entriesViewController
@synthesize TableView;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
[TableView setDelegate:self];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[TableView reloadData];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)startEditing:(id)sender {
if ([TableView isEditing])
{
[TableView setEditing:NO animated:YES];
}
else
{
[TableView setEditing:YES animated:YES];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[[LEItemStore sharedStore] allItems] count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
}
LEItem *p = [[[LEItemStore sharedStore] allItems]objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];
return cell;
}
-(IBAction)newItem:(id)sender {
LEItem *newItem = [[LEItemStore sharedStore] createItem];
[TableView reloadData];
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
LEItemStore *ps = [LEItemStore sharedStore];
NSArray *items = [ps allItems];
LEItem *p = [items objectAtIndex:[indexPath row]];
[ps removeItem:p];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
[[LEItemStore sharedStore] moveItemAtIndex:[sourceIndexPath row] toIndex:[destinationIndexPath row]];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//NSArray *items = [[LEItemStore sharedStore] allItems];
//BNRItem *selectedItem = [items objectAtIndex:[indexPath row]];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self TableView]reloadData];
}
看起来 TableView 没有重新加载其数据。顺便说一句,所有连接都已建立。绝对什么也没有出现。只是我的工具栏,即使添加项目后,TableView 也不会改变。
好吧,在注释中清除此内容后,您的问题是您尚未设置数据源(您也可以使用数组控制器来完成此操作)。 因此,您设置委托和数据源:
[TableView setDelegate:self];
[TableView setdataSource: self];
然后声明该类也实现 UITableViewDataSource 协议。
并且您提供了两种基本方法(也欢迎可选方法):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
这是一个简单数据源实现的示例,只有一个标签打招呼:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell=[[UITableViewCell alloc]init];
UILabel* label= cell.textLabel;
label.text= @"Hello";
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
但是现在您知道如何提供更复杂的数据源:如果您有一个数组,您可以读取索引路径,然后使用 objectAtIndex 方法设置标签。
我对此不确定,但是如果您使用控制器作为数据源,那么您需要为 UITableViewDataSource 指定接口。
尝试改变:
@interface entriesViewController : UIViewController
<UITableViewDelegate,UITableViewDataSource>
将 viewDidLoad 中 tableView 的委托和数据源设置为控制器实例,例如
TableView.delegate = self;
TableView.dataSource = self;
您还可以在 LEItemStore 类上实现 UITableViewDataSource 接口。如果这样做,那么您需要将 dataSource 属性设置为 LEItemStore 的实例。
TableView.delegate = self;
TableView.dataSource = [LEItemStore sharedStore];
我的问题是:我没有定义委托和数据源!
TableView.delegate = self; TableView.dataSource = self;