UITableView刷新问题

时间:2011-03-11 09:48:50

标签: iphone objective-c ios uitableview reloaddata

每次导航包含此表的视图时,我都会尝试刷新UITableView

我有ViewController和自定义UITableViewController设法在应用程序启动时使用控制器中包含的NSMutableArray正确设置表。

当我导航到包含该表的页面时,ViewController调用一个函数,该函数从具有HTTP请求的服务器获取数据并在NSMutableArray中解析它。

现在这是我的问题。我设法将此数组发送到我的UITableViewController,但是当我想刷新tableView时,没有任何反应。

我尝试使用[myTable reloadData],但它不会调用numberOfRowsInSection或cellForRowAtIndexPath函数。我看到有相同问题的人使用[self.myTable ReloadData]解决了它,但我收到错误:

  

访问未知的getter / setter方法

我对Objective-C很陌生,这个错误对我来说仍然有点神秘,因为我有点随意。

无论如何,我很可能在UITableViewController(我应该在哪里声明它?)和Interface Builder链接的声明中弄乱了,所以这可能是找到的线索解决方案。

有人有想法吗?

非常感谢!

编辑:这是我的tableview控制器类:

#import "MyCell.h"

@class Mycell;

@interface MyTableController : UITableViewController {

    IBOutlet MyCell * myCell;
    IBOutlet UITableView * myTable;
    NSMutableArray *data;

}

@property (nonatomic, retain) IBOutlet UITableView * myTable;
- (void) EditTable : (NSMutableArray*) param;


@end

现在是.m:

@implementation MyTableController
@synthesize myTable;

- (void) viewDidLoad {

[super viewDidLoad];
myTable = [[UITableView alloc] init];   
data = [[NSMutableArray alloc] init];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 1;

}

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

return [data count];
}

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

static NSString *CellIdentifier = @"MyCell";

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];  >

if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];

    for (id currentObject in topLevelObjects){

        if ([currentObject isKindOfClass:[UITableViewCell class]]){

        cell =  (MyCell *) currentObject;

            }
        }

    }


    NSString *datastring = [listenom objectAtIndex:indexPath.row];
    [cell setCell: datastring ];
    return cell;
}


- (void) EditTable : (NSMutableArray*) param{   

//This function is called by the ViewController when the user goes to the page containing the view

    data = param; //The param array contains the data from the HTTP request

    [self.tableView reloadData];

    [self.myTable reloadData]; //I tried both, but only the first one actually calls the previous functions

}

3 个答案:

答案 0 :(得分:2)

此代码示例中存在许多问题。我会在这里指出其中的一些,但我强烈建议您阅读相关的Apple文档:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html

代码中的一些问题:

  1. 由于类MyTableController是UITableViewController的子类,因此不需要myTableView的属性和属性。 tableView属性是作为UITableViewController实现的一部分定义和初始化的,其dataSource和delegate设置为UITableViewController实例。这就是[self.tableView reloadData]调用您的委托和dataSource协议方法的原因。

  2. 您也在使用界面构建器,因此如果您确实想要创建自己的子视图,您应该在IB中执行此操作并在那里设置插座或在代码中执行此操作,这意味着在{中创建子视图{1}}然后使用viewDidLoad将其添加到您的视图中。

  3. 为表格设置数据的更好方法是为[view addSubview:mySubView]属性创建属性,并从已初始化data的视图控制器中调用setData实例。您可以使用MyTableController方法执行此操作。您可以在setData:中致电[self.tableView reloadData]。加载视图时无需显式重新加载表,因为这是自动完成的。更简单的一点,如果你留在setData,我会将其重命名为更具描述性,并使用驼峰大小写(例如setDataForTable`)以符合iOS惯例。

  4. 您没有为EditTable中引用的listenom属性显示任何init / alloc。您的意思是使用tableView:cellForRowAtIndexPath:吗?

  5. 您的data文件是完整版本吗?如果是这样,您将缺少MyTableController.mviewDidUnload方法。两者都是必需的。 dealloc应释放viewDidUnloadviewDidLoad中分配的任何对象,应释放控制器保留的任何内容(包括dealloc中发布的对象。

答案 1 :(得分:0)

当您使用tableViewController时,您应该可以使用self.tableView来重新加载这样的数据

[self.tableView reloadData];

答案 2 :(得分:0)

你需要首先合成然后你可以使用self.myTable

在顶部做

@synthesize myTable

然后

[self.myTable reloadData];