0

私はtableViewを持つクラスを持っています。ビルド エラーは発生しませんが、新しいアイテムを追加した後にアプリを実行しようとすると、何も起こらないようです。コードは次のとおりです。

.h で

@interface entriesViewController : UIViewController <UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITableView *TableView;


-(IBAction)startEditing:(id)sender;
-(IBAction)newItem:(id)sender;
@end

.m

#import "entriesViewController.h"
#import "LEItemStore.h"
#import "LEItem.h"

@interface entriesViewController ()

@end

@implementation entriesViewController
@synthesize TableView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        [TableView setDelegate:self];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [TableView reloadData];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(IBAction)startEditing:(id)sender {

    if ([TableView isEditing])
    {
        [TableView setEditing:NO animated:YES];


    }
    else
    {
        [TableView setEditing:YES animated:YES];
    }
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[LEItemStore sharedStore] allItems] count];
}

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

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

    LEItem *p = [[[LEItemStore sharedStore] allItems]objectAtIndex:[indexPath row]];

    [[cell textLabel] setText:[p description]];

    return cell;
}

-(IBAction)newItem:(id)sender {
    LEItem *newItem = [[LEItemStore sharedStore] createItem];
    [TableView reloadData];
}


-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        LEItemStore *ps = [LEItemStore sharedStore];
        NSArray *items = [ps allItems];
        LEItem *p = [items objectAtIndex:[indexPath row]];
        [ps removeItem:p];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    [[LEItemStore sharedStore] moveItemAtIndex:[sourceIndexPath row] toIndex:[destinationIndexPath row]];
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    //NSArray *items = [[LEItemStore sharedStore] allItems];
    //BNRItem *selectedItem = [items objectAtIndex:[indexPath row]];
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[self TableView]reloadData];
}

TableView がデータをリロードしていないように見えます。ちなみに、接続はすべて完了しています。絶対に何も現れません。私のツールバーだけで、アイテムを追加してもTableViewは変わりません。

4

2 に答える 2

3

コメントでこれをクリアした後、問題はデータソースを設定していないことです(アレイコントローラーでもこれを行うことができます)。したがって、デリゲートとデータ ソースを設定します。

[TableView setDelegate:self];
[TableView setdataSource: self];

次に、UITableViewDataSource プロトコルも実装するクラスを宣言します。
そして、2 つの基本的なメソッドを提供します (オプションのメソッドも歓迎します)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

これは、hello というラベルが 1 つだけの単純なデータ ソース実装の例です。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell=[[UITableViewCell alloc]init];
    UILabel* label= cell.textLabel;
    label.text= @"Hello";
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

しかし、これで、より複雑なデータ ソースを提供する方法がわかりました。配列がある場合は、インデックス パスを読み取ってから、objectAtIndex メソッドを使用してラベルを設定できます。

于 2012-11-16T00:34:48.467 に答える
1

これについてはよくわかりませんが、コントローラーをデータ ソースとして使用している場合は、UITableViewDataSource のインターフェイスを指定する必要があります。

変更してみてください:

@interface entriesViewController : UIViewController
   <UITableViewDelegate,UITableViewDataSource>

viewDidLoad の tableView のデリゲートと dataSource をコントローラー インスタンスに設定します。

TableView.delegate = self;
TableView.dataSource = self;

LEItemStore クラスに UITableViewDataSource インターフェイスを実装することもできます。その場合、dataSource プロパティを LEItemStore のインスタンスに設定する必要があります。

TableView.delegate = self;
TableView.dataSource = [LEItemStore sharedStore];
于 2012-11-16T00:27:01.037 に答える