UITableView的ReloadData无法正常工作; tableView在记录时返回NULL

时间:2013-07-17 03:42:53

标签: ios uitableview null reloaddata

我在另一个类的TableViewController类中调用一个方法。

要调用显示tableview的方法,我这样做:

TableViewController *tableVC = [[TableViewController alloc]init];
[tableVC setTableViewContent];

然后在TableViewController.h

@interface TableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
{
NSMutableArray *nameArray;
}

-(void)setTableViewContent;
@property (nonatomic, strong) IBOutlet UITableView *tableView;

@end

TableViewController.m

@implementation TableViewController
@synthesize tableView;


- (void)viewDidLoad
{ 
 nameArray = [[NSMutableArray alloc]init];
[super viewDidLoad];

}

-(void)setTableViewContent{


AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

for(int i=0;i< [appDelegate.businessArray count];i++)
{

    NSDictionary *businessDict = [[appDelegate.businessArray objectAtIndex:i] valueForKey:@"location"];


    nameArray = [appDelegate.businessArray valueForKey:@"name"];

}
NSLog(@"%@", nameArray);


  NSLog(@"tableview: %@", tableView);

// here tableview returns null
[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 [nameArray count];
}

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

    // Configure the cell...
         cell.textLabel.text = [nameArray objectAtIndex:indexPath.row];

    return cell;
}

出于某种原因,当我尝试记录tableview时,它返回null,因此ReloadData不起作用。委托和数据源在IB中正确连接,并且有一个tableView的引用插座。

知道这里发生了什么吗?提前致谢

3 个答案:

答案 0 :(得分:3)

如果将表视图控制器添加到容器视图,则可以在prepareForSegue中获取对该控制器的引用。对于容器视图中的控制器,prepareForSegue将在父控制器的viewDidLoad之前调用,因此您无需执行任何操作来调用它。在下面的例子中,我将segue称为“TableEmbed” - 您需要在IB中给出segue标识符。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"TableEmbed"]) {
        TableViewController *tableVC = (TableViewController *)segue.destinationViewController;
        [tableVC setTableViewContent];
    }
}

请注意,在调用控制器的viewDidLoad之前调用prepareForSegue:sender:所以你应该将数组的初始化移动到setTableViewContent,并且reloadTable应该进入viewDidLoad。

顺便说一下,我不清楚你为什么要从你的其他班级调用setTableContent。为什么不将该方法中的所有代码移动到表视图控制器的viewDidLoad方法?

答案 1 :(得分:0)

这种情况正在发生,因为您在tableView实际存在之前调用了一个方法。简单地初始化该类本身并不会绘制表,因此在实际创建表之前使用reloadData并没有任何意义。

在这种情况下你要做的是在任何调用setTableViewContent的类中创建你的nameArray,然后通过自定义init方法传递它,或者在加载该表视图控制器之前设置tableVC.nameArray。

我要做的是制作自定义初始化方法,如- (id)initWithArray:(NSMutableArray *)nameArr

哪个应该是这样的:

if (self = [super init]) {
    nameArray = [nameArr copy];
}
return self;

然后你有TableViewController *tableVC = [[TableViewController alloc]init];放置TableViewController *tableVC = [[TableViewController alloc]initWithArray:theNameArray];其中theNameArray是setTableViewContent中的内容(你现在在调用表视图而不是在表视图本身的同一个类中生成)。< / p>

有意义吗?

答案 2 :(得分:0)

我通过在UITableViewController

上创建“安全”重新加载方法解决了类似情况
- (void)reloadTableViewData
{
    if ([self isViewLoaded])
        [self.tableView reloadData];
}

根据docs for isViewLoaded

  

调用此方法会报告视图是否已加载。与view属性不同,如果视图尚未在内存中,则不会尝试加载视图。

因此,可以随时在表视图控制器上调用reloadTableViewData