0

UPDATE: The problem is kind of resolved. I put everything from my functions class directly into my myView class.... now works like a charm. Don't exactly know why, but it does. Maybe some of you could speculate on that. I'd welcome any help.

------

I thought myself at least an advanced programmer before objective-c... I just started coding apps and it went quite ok so far. But now I'm in a bit of pickle. See, I have a UITableView whose data is supposed to update periodically. My app gets its data from a webserver and stores it into an array. so far so good - all that works according to NSLog outputs. The UiTableView EVEN UPDATES when I put the [myTable updateData] into a button action. But when it's called out of another method, it does nothing...

My code so far (abbreviated): myView.h:

@interface myView : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    @public
    IBOutlet UITableView *myTable;
}

- (void)reloadMyTable;
- (IBAction)testbtn:(id)sender;

@end

myView.m:

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

{
    Model *model=[Model getInstance];
    return [model.ARrecentnews count];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{
    return numberOfSections;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:   (NSInteger)section

{
    return @"Some Headline";
}

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

{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
    Model *model=[Model getInstance];
    cell.textLabel.text = [model.ARrecentnews objectAtIndex:([model.ARrecentnews count]-indexPath.row-1)]; //Populating Table in reverse order

    return cell;
}


- (IBAction)testbtn:(id)sender {

    [myTable reloadData];

}


- (void)reloadMyTable {

   [myTable reloadData];

}
4

4 回答 4

0

请首先检查您是否在 xib 中将 Outlet 给了您 TableView。我的意思是您是否已将 myTable 连接到您在 xib 文件中获取的 tableview。在 .h 文件中替换

UITableView *myTable;

IBOutlet  UITableView *myTable;

并提供参考。

并将以下行添加到 cellFor RowAtIndexPath:

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

希望这会帮助你。

于 2013-09-05T12:05:14.370 回答
0

确保从主线程调用 UI 代码:

- (void)reloadMyTable {
    dispatch_async(dispatch_get_main_queue(), ^{
        [myTable reloadData];
    });
}

(我强烈怀疑从 Web 服务器获取数据的代码正在后台线程中运行;如果不是,则应该是)...

于 2013-09-05T11:35:16.073 回答
0

在这个类中,我从服务器执行数据收集,一旦数据存储在数组中,它通过以下方式调用 reloadMyTable myView *view = [[myView alloc]init]; [view reloadMyTable]

从您的评论看来,您创建了 viewController 的一个新实例,然后在该实例上调用了您的方法。这不会对显示的 tableView 做任何事情。

您必须想办法获取对现有myView实例的引用。你如何做到这一点取决于你在代码中做了什么,如果不知道这一点很难说清楚。

您可以在保存 viewController 的 Function 类中添加一个 @property。或者您添加一个调用 reloadData 的完成块。您也可以使用 NSNotifications。有很多方法可以告诉正在显示的 viewController 它应该重新加载它的 tableView。


PS:Objective-C 中的类应该以大写字母开头,即你的类应该叫MyView。并且由于该类是 UIViewController 的子类而不是 UIView 我会称之为它MyViewController。清晰很重要,我不希望 UIViewController 子类被称为 MyView。

于 2013-09-05T14:26:32.060 回答
0

在 cellForRowAtIndexPath: 中放一个断点,当 [mytable reloadData]; 被调用,检查它是否触发了 tbaleview 的 del 方法。我怀疑它正在重新加载数据但没有新数据要显示?你检查过数据源吗?

此外,您的 .h 文件现在看起来如何更改?在 IB 中,您是否将 tableview 的数据源/委托链接到您的视图?

于 2013-09-05T13:36:07.610 回答