无法在标签栏控制器中重新加载表视图

时间:2011-10-06 01:37:20

标签: objective-c ios uitableview uitabbarcontroller reloaddata

您好我有一个标签选项卡控制器,我的第一个标签包含一个视图:

  • 3个文字字段
  • 提交按钮
  • 一个tableView

填写文本字段后,我单击“提交”,然后将信息添加到我的managedObjectContext,这是一个sqlite数据库(CoreData)。

一旦我点击提交,我希望tableView重新加载以包含添加的对象。目前我的tableView将显示数据库中的数据,但它只会在我停止并重新运行模拟器时添加新行

这是点击添加按钮时的代码,在这里我无法让reload 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;  
}

我在这个网站和其他网站上搜索了答案,但我必须做一些与众不同的解决方案并没有帮助我

2 个答案:

答案 0 :(得分:4)

您的UIViewController当前没有指向您的tableview的实例变量。设置一个:

@property (nonatomic, retain) IBOutlet UITableView *myTableView;

请记住在你的.m

中综合这个
@synthesize myTableView;

然后在您的代码中,您可以致电

[self.myTableView reloadData];

通过查看使用UITableViewController而不是UIViewController的代码示例,您可能会感到困惑。 UITableViewController已经有一个名为tableView的实例变量,所以你的子类不需要它自己声明的tableView实例变量。但是你正在使用UIViewController,所以你必须声明一个tableView实例变量。

答案 1 :(得分:1)

感谢@MattyG提供的所有帮助。起初我不确定我是否反对这种规范,这就是为什么它不起作用。

由于你的建议,我最终解决了这个问题。它完美地运作!我使用了调试器并发现尽管我们已经为表创建了一个属性,但我没有创建一个IBOutlet并将其链接到我的nib文件中:

IBOutlet UITableView *myTableView;

我想这意味着我告诉myTableView重新加载,但它没有连接到我的表,因此无法使用数据源方法。