Не удается перезагрузить табличное представление в контроллере панели вкладок - PullRequest
0 голосов
/ 06 октября 2011

Привет, у меня есть контроллер вкладок, и моя первая вкладка содержит представление с:

  • 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, чтобы соединения делегата и источника данных были связаны с владельцем файла.

#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 ]

4 голосов
/ 06 октября 2011

Ваш UIViewController в настоящее время не имеет переменной экземпляра, указывающей на ваше представление таблицы.Настройте один:

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

Не забудьте синтезировать это в своем .m

@synthesize myTableView;

Тогда в своем коде вы можете позвонить

[self.myTableView reloadData];

Возможно, вы получилисбит с толку, глядя на примеры кода, которые используют UITableViewController вместо UIViewController.UITableViewController уже имеет переменную экземпляра с именем tableView, поэтому вашему подклассу не потребуется декларировать собственную переменную экземпляра tableView.Но вы используете UIViewController, поэтому вы должны объявить переменную экземпляра tableView.

1 голос
/ 07 октября 2011

Спасибо @MattyG за всю вашу помощь.Сначала я не был уверен, иду ли я против нормы, и поэтому это не сработало.

Я закончил тем, что решил проблему из-за ваших предложений, и она работает отлично!Я использовал отладчик и обнаружил, что, хотя мы создали свойство для таблицы, я не создал IBOutlet и связал его в своем файле nib с помощью:

IBOutlet UITableView *myTableView;

Я думаю, это означало, что я говорил myTableViewперезагрузить, но он не был подключен к моей таблице и поэтому не мог использовать методы источника данных.

...