0

こんにちは私はタブタブコントローラーを持っていて、私の最初のタブには次のビューが含まれています:

  • 3つのテキストフィールド
  • 送信ボタン
  • tableView

テキストフィールドに入力したら、[送信]をクリックすると、sqliteデータベース(CoreData)であるmanagedObjectContextに情報が追加されます。

[送信]をクリックするとすぐに、追加されたオブジェクトを含めるために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;  
}

私はこのサイトや他のサイトで答えを探しましたが、私は何か違うことをしているに違いありません、そして解決策は私を助けていません

4

2 に答える 2

4

UIViewControllerには、現在、テーブルビューを指すインスタンス変数がありません。1つ設定します。

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

これを.mで合成することを忘れないでください

@synthesize myTableView;

次に、コードで呼び出すことができます

[self.myTableView reloadData];

UIViewControllerの代わりにUITableViewControllerを使用するコード例を見て混乱しているかもしれません。UITableViewControllerにはすでにtableViewというインスタンス変数があるため、サブクラスで独自のtableViewインスタンス変数を宣言する必要はありません。ただし、UIViewControllerを使用しているため、tableViewインスタンス変数を宣言する必要があります。

于 2011-10-06T05:04:00.013 に答える
1

@MattyGにご協力いただきありがとうございます。最初は、私が規範に反しているかどうかわからなかったので、それが機能していませんでした。

私はあなたの提案のために問題を解決することになりました、そしてそれは完璧に機能します!デバッガーを使用したところ、テーブルのプロパティを作成したものの、IBOutletを作成しておらず、nibファイルで次のようにリンクしていることがわかりました。

IBOutlet UITableView *myTableView;

これは、myTableViewにリロードするように指示していたが、テーブルに接続されていなかったため、データソースメソッドを使用できなかったことを意味していると思います。

于 2011-10-07T07:03:24.273 に答える