0

UIView コントローラーで UITableView を作成しています

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 470, self.view.frame.size.height) style:UITableViewStylePlain];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    [self.view addSubview:self.tableView];
    NSLog(@"tableView is '%@'",self.tableView);
}

NSLog の結果 :"tableView は '< UITableView: 0x7c60c00; フレーム = (0 0; 470 1004); clipsToBounds = YES; ジェスチャレコグナイザー = ; レイヤー = ; contentOffset: {0, 0}>'"

itemArray が他のコントローラーによって変更されると、refreshTableView メソッドが呼び出されます。

**SideBarViewController *sideBarViewController = [[SideBarViewController alloc]init];
[sideBarViewController refreshTableView];**

-(void)refreshTableView {
    [self createItemArray];
    NSLog(@"reload itemArray->%@",self.itemArray);
    NSLog(@"tableView is '%@'",self.tableView);
    [self.tableView reloadData];
}

どういうわけか、NSLogの結果は次のようになります:" tableView is '(null)' ". tableView はリロードされません。

なぜ?助けてください。ありがとう。

アップデート:

itemArray の NSLog は問題ありませんでした:

変更前 reload itemArray->( "test.md" )

変更後 reload itemArray->( "test.md", "test2.md" )

アップデート2:

#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.itemArray count];
}

- (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];
    }

    cell.textLabel.text = [self.itemArray objectAtIndex:indexPath.row];
    return cell;
}

更新 3:

.h
@interface SideBarViewController : UIViewController<IIViewDeckControllerDelegate,UITableViewDataSource,UITableViewDelegate>

.m
@interface SideBarViewController ()
@property (nonatomic,strong) UITableView *tableView;
@end

@implementation SideBarViewController
@synthesize tableView = _tableView;

更新 4 :

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath 

行を削除した後、テーブルビューがリロードされました。

4

3 に答える 3

1

正確な問題を見つけることができるように、さらにコードを共有してください。

あなたのtableViewの実際の名前を確認できますか?.h ファイルで宣言したテーブルのコードを共有します。

配列を確認してください。リロードまたは更新の前にデータが利用可能であり、テーブル ビュー メソッドが正常に機能しています。

.h ファイルで tableView デリゲートを定義しているかどうかを確認してください。そして、クラスにtableViewのデリゲートメソッドを適切に実装してください..

@interface MyViewController:UIViewController

もう 1 つ、データ ソースとデリゲート メソッドが適切に実装されていることを確認します。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.

このことを正しく行った場合は、ロードする前に配列にデータが含まれているかどうかを確認してください。これはあなたを助けるかもしれません。

于 2013-03-28T06:40:22.507 に答える
0
  //
    //  ViewController.h
    //  tableData
    //
    //  Created by Nirav Jain on 3/28/13.
    //  Copyright (c) 2013 SI. All rights reserved.
    //

    #import <UIKit/UIKit.h>

    @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
    {
        int rows;
    }
    @end


//  tableData
//
//  Created by Nirav Jain on 3/28/13.
//  Copyright (c) 2013 SI. All rights reserved.
//

#import "ViewController.h"

//@implementation SideBarViewController


@interface ViewController ()
@property (nonatomic,strong) UITableView *tableView;
@end

@implementation ViewController

@synthesize tableView = _tableView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 470, self.view.frame.size.height) style:UITableViewStylePlain];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    [self.view addSubview:self.tableView];
    NSLog(@"tableView is '%@'",self.tableView);
    rows = 5;


    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonItemStyleDone target:self action:@selector(refreshTableView)];
}


-(void)refreshTableView {

    rows = 12;
    NSLog(@"tableView is '%@'",self.tableView);
    [self.tableView reloadData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

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

- (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];
    }

    cell.textLabel.text =  [ NSString  stringWithFormat:    @"%d", indexPath.row];
    return cell;
}

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

@end
于 2013-03-28T07:09:29.553 に答える
0

通知を使用してみることができます

  1. Observer を Sidebarvc の viewDidLoad に追加します

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTableView:) name:@"dataChanged" object:nil];

  2. リフレッシュするメソッドを作成する

    -(void)refreshTableView:(NSNotification *)notif{ }

  3. もう一方の VC では、通知を待ちます

    [[NSNotificationCenter defaultCenter] postNotificationName:@"dataChanged" object:nil];

4.掃除を忘れずに

add [[NSNotificationCenter defaultCenter] removeObserver:self]; to ViewDidUnload

動作するはずです。

于 2013-03-28T08:37:15.593 に答える