我在Storyboard中创建了一个Table View,并尝试填充ViewController中的行。当我调用[self.tableView]时,它不会刷新内容(它不会调用cellForRowAtIndexPath)。
SetListViewController.h:
#import <UIKit/UIKit.h>
@interface SetListViewController : UITableViewController
@end
SetListViewController.m
#import "SetListViewController.h"
#import "SetCell.h"
#import "Set.h"
@interface SetListViewController () <UITableViewDataSource, UITableViewDelegate>
{
NSMutableArray *userSets; // array containing all the user's set objects
}
@implementation SetListViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.userSets = [[NSMutableArray alloc] init];
[self.tableView setDataSource:self];
[self.tableView setDelegate:self];
// load sets
[self fetchSets];
}
- (void)fetchSets{
for(NSDictionary *currentSet in set){
Set *userSet = [[Set alloc] init];
userSet.name = [currentSet objectForKey:@"name"];
[userSets addObject:UserSet];
}
[self.tableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.userSets.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.userSets.count;
}
- (SetCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"in cellForRowAtIndexPath");
SetCell *cell = [tableView dequeueReusableCellWithIdentifier:@"setCell" forIndexPath:indexPath];
NSDate *object = self.userSets[indexPath.row];
cell.setTitleLabel.text = [object description];
NSLog(@"setTitleLabel: %@", cell.setTitleLabel);
return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"deleting set");
[self deleteSet:(NSString *)[self.userSets objectAtIndex:indexPath.row]];
NSLog(@"set ID: %@", [self.userSets objectAtIndex:indexPath.row]);
[self.userSets removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}
@end
我做错了什么?
答案 0 :(得分:3)
我认为问题在于你有一个名为userSets的属性,还有一个名为userSets的ivar(我假设你有一个属性,即使你没有显示它,因为使用self.userSets会给你一个错误除此以外)。在viewDidLoad中,您实例化了该属性,但在fetchSets中,您尝试使用[userSets addObject:UserSet]
填充ivar - 但您从未初始化该数组。你应该摆脱ivar,并始终将你的财产称为self.userSets。
答案 1 :(得分:1)
您是否实现了表视图的dataSource方法:
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
和
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
请确保实现UITableView
的上述dataSource方法答案 2 :(得分:0)
首先使用UIViewController创建nib文件。 在.h文件中设置以下
#import <UIKit/UIKit.h>
@interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@end
在.m文件中执行以下操作
@implementation SimpleTableViewController
{
NSArray *tableData;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Initialize table data
tableData = [NSArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", @"Hamburger", @"Ham and Egg Sandwich", @"Creme Brelee", @"White Chocolate Donut", @"Starbucks Coffee", @"Vegetable Curry", @"Instant Noodle with Egg", nil];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
return cell;
}
在.xib文件中,执行以下
试试这个并回复你找到的内容