无法在标签栏控制器中重新加载表格视图
Posted
技术标签:
【中文标题】无法在标签栏控制器中重新加载表格视图【英文标题】:Can't reload Table View in tab bar controller 【发布时间】:2011-10-06 01:37:19 【问题描述】:您好,我有一个选项卡选项卡控制器,我的第一个选项卡包含一个视图:
3 个文本字段 提交按钮 一个表格视图填写完文本字段后,我单击提交,它会将信息添加到我的 managedObjectContext 中,它是一个 sqlite 数据库 (CoreData)。
单击提交后,我希望 tableView 重新加载以包含添加的对象。目前我的 tableView 将显示数据库中的数据,但它只会在我停止并重新运行模拟器时添加新行
这是点击添加按钮时的代码,在这里我无法让重新加载 tableView 工作,因为它说 tableView 是一个未声明的标识符,我错过了什么?
-(IBAction)addButtonTapped:(id)sender
NSLog (@"Add Button Tapped");
NSLog(@"Adding %@ units of item code %@ at $%@ each",quantityTextField.text,productTextField.text,priceTextField.text);
Products_MarketAppDelegate* delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext* managedObjectContext = delegate.managedObjectContext;
NSManagedObject* newProduct;
newProduct = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:managedObjectContext];
[newProduct setValue:productTextField.text forKey:@"itemCode"];
[newProduct setValue:quantityTextField.text forKey:@"quantity"];
[newProduct setValue:priceTextField.text forKey:@"price"];
if ([managedObjectContext hasChanges])
NSLog(@"Managed Object Changed");
NSError* error;
[managedObjectContext save:&error];
// Insert Reload Table Code Here
// ** I have tried the following and it gives an error "Use of undeclared identifier 'tableView'"
//[tableView reloadData];
//[self.tableView reloadData];
如下所示,我在头文件中添加了 UITableViewDelegate 和 UITableViewDataSource。我还在 IB 中连接了 tableview,以便委托和数据源连接链接到文件的所有者。
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface FirstViewController : UIViewController
<UIApplicationDelegate, UITableViewDataSource,UITableViewDelegate,NSFetchedResultsControllerDelegate>
IBOutlet UITextField *productTextField;
IBOutlet UITextField *quantityTextField;
IBOutlet UITextField *priceTextField;
NSMutableArray *items;
NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSMutableArray *items;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
-(IBAction)addButtonTapped:(id)sender;
@end
这是填充正确工作的tableView的代码
#pragma mark TableView
-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
- (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] autorelease];
// Configure the cell
Product* productItem =[fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%@ x %@ @ $%@",productItem.quantity,productItem.itemCode,productItem.price];
return cell;
我已经在这个网站和其他网站上搜索过答案,但我必须做一些不同的事情,而这些解决方案对我没有帮助
【问题讨论】:
【参考方案1】:您的 UIViewController 当前没有指向您的 tableview 的实例变量。设置一个:
@property (nonatomic, retain) IBOutlet UITableView *myTableView;
记得在你的 .m 中合成它
@synthesize myTableView;
然后在你的代码中你可以调用
[self.myTableView reloadData];
查看使用 UITableViewController 而不是 UIViewController 的代码示例,您可能会感到困惑。 UITableViewController 已经有一个名为 tableView 的实例变量,因此您的子类不需要声明它自己的 tableView 实例变量。但是你使用的是 UIViewController,所以你必须声明一个 tableView 实例变量。
【讨论】:
好的,感谢您的帮助,我已经按照您的建议进行了更改。这实际上是我之前尝试过然后删除的东西,因为它仍然没有成功。还有什么我可以尝试的吗?它没有给出任何错误,但 tableView 保持不变。我没有使用导航控制器。文本字段、按钮和tableView都在同一个视图上,这是个问题吗? 不,将文本字段、按钮和 tableView 放在同一个视图上是非常好的。尝试放置一些 NSLog 语句来帮助调试。具体来说,在您的 tableView:cellForRowAtIndexPath: 方法中放置一个。例如 NSLog(@"我在方法 tableView:cellForRowAtIndexPath:"); 好的,非常感谢。我按照你的建议做了,它确认 [self.myTableView reloadData] 没有运行任何与 tableView 相关的方法。我一直在查看文档,因为我使用的是 NSFetchedResultsController 我应该使用 '- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller [self.myTableView endUpdates]; ' 和其他方法更新表格视图的变化? 抱歉,我不适合 NSFetchedResultsController 类。 -endUpdates 只会在调用 -beginUpdates 之后使用。如果您不希望重新加载整个表(而不是调用 -reloadData),则可以使用它们。在使用它们之前阅读它们。我建议您专注于找出为什么您调用 reloadData 时没有调用您的 tableView 数据源方法。尝试隔离代码中的问题并单独调试每个问题。【参考方案2】:感谢@MattyG 的所有帮助。起初我不确定我是否违反了规范,这就是为什么它不起作用。
由于您的建议,我最终解决了问题,并且效果很好!我使用了调试器,发现虽然我们为表创建了一个属性,但我没有创建一个 IBOutlet 并将其链接到我的 nib 文件中:
IBOutlet UITableView *myTableView;
我猜这意味着我告诉 myTableView 重新加载,但它没有连接到我的表,因此无法使用数据源方法。
【讨论】:
不客气,很高兴我能帮上忙。在追踪出口遗漏方面做得很好。我忘记了您可能正在使用界面生成器,而不是在代码中初始化您的表格视图。我已将 IBOutlet 添加到我的答案中,以供其他人将来参考。干杯,马蒂以上是关于无法在标签栏控制器中重新加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章