2011-10-06 52 views
0

您好我有一个标签选项卡控制器和我的第一个标签包括一个观点:不能重装表视图在标签栏控制器

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

一旦我填写文本字段,我点击提交,它将信息添加到我的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 

这是代码,以填补其正常工作

#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; 
} 

...我已经寻找在这个网站的答案和别人,但我必须做一些不同,解决方案并不帮助的tableView我

回答

4

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

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

记得看代码示例合成这种在您的m

@synthesize myTableView; 

然后在你的代码,你可以调用

[self.myTableView reloadData]; 

你可能弄糊涂了使用UITableViewController而不是UIViewController。 UITableViewController已经有一个名为tableView的实例变量,所以你的子类不需要声明自己的tableView实例变量。但是你使用的是UIViewController,所以你必须声明一个tableView实例变量。

+0

好的,谢谢你的帮助,我已经做出了你所建议的改变。这实际上是我之前尝试过,然后删除,因为它仍然没有把戏。还有什么我可以尝试吗?它没有提供任何错误,但tableView保持不变。我没有使用导航控制器。文本字段,按钮和tableView都在相同的视图,这是一个问题? – msec

+0

不,在同一个视图上使用textfields,button和tableView是完全正确的。尝试放置一些NSLog语句来帮助调试。具体来说,把一个放在你的tableView:cellForRowAtIndexPath:方法中。例如NSLog(@“我在方法tableView:cellForRowAtIndexPath:”); – MattyG

+0

好的,谢谢你的提示。我按照你的建议做了,它确认[self.myTableView reloadData]不运行任何与tableView有关的方法。我一直在看文档,因为我正在使用NSFetchedResultsController我应该使用_'-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller {self.myTableView endUpdates]; }'_和其他方法来更新表视图中的更改? – msec

1

感谢@MattyG为您提供的所有帮助。起初我不确定我是否违背了规范,那就是为什么它不起作用。

我最终解决了这个问题,由于你的建议&它完美的工作!我使用的调试和发现,虽然我们创造了一个属性表我没有创建一个IBOutlet,并连接它在我的笔尖文件:

IBOutlet UITableView *myTableView; 

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

+0

不客气,很高兴我能帮到你。好的工作,追踪出口遗漏。我忘了你可能使用的是界面生成器,而不是在代码中初始化你的tableview。我已经将IBOutlet添加到了我为其他人未来参考的答案中。欢呼声,马蒂 – MattyG

+0

+ 1为成功调试需要插座=) – MattyG

相关问题