2

私はプログラミングと iOS の初心者です Crud 操作やインベントリ システムのような iPhone アプリケーションを作成しています UITableView でデータを表示したりデータを取得したりすることができません

しかし、配列を印刷すると、このタイプの出力が生成されます。

2013-10-03 15:45:04.228 inventrymanagementsystem[1968:c07] name: (
    "<Category: 0x7453f40> (entity: Category; id: 0x744a3b0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p1> ; data: <fault>)",
    "<Category: 0x7456500> (entity: Category; id: 0x74501f0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p2> ; data: <fault>)",
    "<Category: 0x7456210> (entity: Category; id: 0x7450970 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p3> ; data: <fault>)",
    "<Category: 0x7457830> (entity: Category; id: 0x743bd90 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p4> ; data: <fault>)",
    "<Category: 0x7455cf0> (entity: Category; id: 0x7438670 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p5> ; data: <fault>)",
    "<Category: 0x744b060> (entity: Category; id: 0x7438530 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p6> ; data: <fault>)",
    "<Category: 0x74496f0> (entity: Category; id: 0x7436050 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p7> ; data: <fault>)",
    "<Category: 0x744f290> (entity: Category; id: 0x744db90 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p8> ; data: <fault>)",
    "<Category: 0x744eaa0> (entity: Category; id: 0x7439d40 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p9> ; data: <fault>)",
    "<Category: 0x744fec0> (entity: Category; id: 0x74385c0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p10> ; data: <fault>)",
    "<Category: 0x744f410> (entity: Category; id: 0x7445de0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p11> ; data: <fault>)",
    "<Category: 0x74557c0> (entity: Category; id: 0x744ebe0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p12> ; data: <fault>)",
    "<Category: 0x7456190> (entity: Category; id: 0x7450b30 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p13> ; data: <fault>)",
    "<Category: 0x7457010> (entity: Category; id: 0x7453180 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p14> ; data: <fault>)",
    "<Category: 0x744b740> (entity: Category; id: 0x74524b0 <x-coredata://431EF8C4-5AAE-4AA8-ADFB-A09CE5731E2D/Category/p15> ; data: <fault>)"
)

何が問題なのか理解できません。

コード

#import "IMScategoriesViewController.h"
#import "IMSAddCategoryViewController.h"
#import "IMSAppDelegate.h"
#import "Category.h"

@interface IMScategoriesViewController ()
@property (strong) NSMutableArray *categories;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic,retain) NSFetchedResultsController *fetchedresultcontroller;
@end
@implementation IMScategoriesViewController
- (NSManagedObjectContext *)managedObjectContext
{
    NSManagedObjectContext *context;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}
//- (void)viewDidAppear:(BOOL)animated
//{
//    [super viewDidAppear:animated];

   - (void)viewDidLoad
{
    [super viewDidLoad];

    // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
   NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Category"];
    self.categories = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
    NSLog(@"name: %@",self.categories);
    [self.tableView reloadData];

// IMSAppDelegate * appDelegate = [UIApplication sharedApplication].delegate;
//    self.managedObjectContext = appDelegate.managedObjectContext;
//
//    // Fetching Records and saving it in "fetchedRecordsArray" object
//   self.categories = [[appDelegate getallcategories]mutableCopy];
//    NSLog(@"name: %@",self.categories);
//    [self.tableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.getallcategories count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
 //   UITableViewCell *cell = [UITableView dequeueReusableCellWithIdentifier:@"Cell"];

    //add this
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    Category * category = [self.getallcategories objectAtIndex:indexPath.row];
    cell.textLabel.text = [category name];
    return cell;
}
4

2 に答える 2

0

デリゲートとデータ ソース接続を確認してください。テーブル ビュー デリゲートとデータ ソースを設定します。@interface myViewController : UIViewController {...} 設定します。テーブルビューのチュートリアルを参照してください

于 2013-10-04T15:07:12.247 に答える
0

2 つの問題があります。

1) NSEntityDescriptionオブジェクトnameのプロパティにアクセスしています。一時的にこれを行っているだけかもしれませんが、エンティティにプロパティを作成した場合は、そのプロパティ名を別のもの (または など) に変更する必要があります。これは既に予約されているためです。nameCategorycategoryNameitemName

2) NSLog をcellForRowAtIndexPathメソッドに配置して を表示するcategoryと、カテゴリの配列が返されたため、明らかにデータ ソースに正しくアクセスしていません。

問題は、メソッドで[self.getallcategories objectAtIndex:indexPath.row];作成した元の配列にアクセスする代わりに、次のようにする必要があることです。viewDidLoad

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Access the proper array here that you loaded in viewDidLoad
    return [self.categories count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    // Access the proper array here that you loaded in viewDidLoad
    Category * category = [self.categories objectAtIndex:indexPath.row];

    cell.textLabel.text = [category name];
    return cell;
}

前述したように、テーブルビューに対してそのようなフェッチを実行する代わりに、NSFetchedResultsControllerを使用する必要があります。NSFetchedResultsController は、画面に表示されているオブジェクトのみをフェッチするため、テーブル ビューのデータソースとして機能するように最適化されています。

また、新しいテーブル ビュー セルをインスタンス化する古い方法を使用しています。プロトタイプ セルを使用する必要があり (Interface Builder でセル識別子を設定)、コードは次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Make sure your prototype cell in Interface Builder has an identifier called "Cell"
    UITableViewCell *cell = [UITableView dequeueReusableCellWithIdentifier:@"Cell"];

    // Access the proper array here that you loaded in viewDidLoad
    Category *category = [self.categories objectAtIndex:indexPath.row];

    // Assuming the Category entity has somePropertyNameHere method
    cell.textLabel.text = category.somePropertyNameHere;
    return cell;
}
于 2013-10-04T15:59:19.130 に答える