我在另一个类的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的引用插座。
知道这里发生了什么吗?提前致谢
答案 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];
}
调用此方法会报告视图是否已加载。与view属性不同,如果视图尚未在内存中,则不会尝试加载视图。
因此,可以随时在表视图控制器上调用reloadTableViewData
。