我是iOS的新手编程,我在向UITableView对象添加新单元格时遇到了问题。我正在使用故事板,其中一个场景是一个UIViewController,它有几个子视图:textfields,tableview等。我打算从一个细节场景向这个tableView添加行。
我最初能够在表中添加行,但之后我无法添加行。当我按下按钮添加行时,我调用方法'[self.stepsListTableView reloadData];'它产生对方法' - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section'的调用,它返回一个正确的值,包括新的数组元素。但方法' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath :( NSIndexPath *)indexPath'未被调用来更新表。
我不明白我做错了什么。
我的源代码详情:
WorkoutDetailsViewController.h
(…)
@interface WorkoutDetailsViewController : UIViewController <StepDetailsViewControllerDelegate, UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, weak) id <WorkoutDetailsViewControllerDelegate> delegate;
@property (nonatomic, strong) Workout *workout;
(…)
@property (nonatomic, retain) IBOutlet UITableView *stepsListTableView;
(…)
WorkoutDetailsViewController.m
(…)
@synthesize stepsListTableView;
(…)
- (void)viewDidLoad
{
[super viewDidLoad];
addButton.enabled = FALSE;
workoutNameField.delegate = self;
if (self.workout == nil) {
self.workout = [[Workout alloc] init];
self.stepsListTableView = [[UITableView alloc] init];
}
self.stepsListTableView.delegate = self;
self.stepsListTableView.dataSource = self;
}
(…)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//return [self.workout.stepsList count];
NSInteger counter = 0;
counter = [self.workout.stepsList count];
return counter;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Set up the cell...
// Pending
return cell;
}
- (void)stepDetailsViewControllerDidDone:(StepDetailsViewController *)controller
{
[self.workout.stepsList addObject:controller.step];
NSInteger counter = [self.workout.stepsList count];
[self.stepsListTableView beginUpdates];
NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:(counter-1) inSection:0]];
[self.stepsListTableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop];
[self.stepsListTableView endUpdates];
[self.stepsListTableView reloadData];
}
(…)
同样在故事板中,我将outlet delegate和dataSource设置为控制器视图。
有什么想法吗?
此致 JoanBa
答案 0 :(得分:1)
我已经解决了这个问题。我发现使用调试器调用方法reloadData用于与viewDidLoad中初始化的UITableView不同的UITableView。
我在故事板中查看了UITableView设置,这显然是正确的但我删除了它们并再次创建。现在它有效。
在UIViewController标题中,我有一行
@property (nonatomic, retain) IBOutlet UITableView *stepsListTableView;
在实施中我评论了行
//self.stepsListTableView.delegate = self;
//self.stepsListTableView.dataSource = self;
当然,在故事板中,我为UITableView定义了以下关系:
Outlets:dataSource,delegate - &gt;的UIViewController
引用插座:UITableView - &gt;的UIViewController
就是这样!!
答案 1 :(得分:0)
您可以将表格视图设置为静态内容。在Storyboard中选择UITableView,在屏幕右侧菜单的“Attributes Inspector”部分中选择“Table View”标题下的“Content”字段,并将值设置为“Dynamic Prototypes”。
屏幕截图为清晰起见:
当我开始时,这个小伎俩几次把我抓了出来。