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 is '< UITableView: 0x7c60c00; frame = (0 0; 470 1004); clipsToBounds = YES;gestureRecognizers = ; layer = ; 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 很好:

更改之前重新加载 itemArray->( "test.md" )

更改后重新加载 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

还有一件事检查您是否正确实现了数据源和 delagate 方法。

- (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. 在 Sidebarvc 中将 Observer 添加到 viewDidLoad 中

    [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@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 回答