Iphone UITableView刷新问题

Iphone UITableView刷新问题,iphone,objective-c,ios,uitableview,reloaddata,Iphone,Objective C,Ios,Uitableview,Reloaddata,每次导航包含此表的视图时,我都试图刷新UITableView 我有一个ViewController和一个自定义UITableViewController,它使用控制器中包含的NSMutableArray成功地在应用程序启动时正确设置表 当我导航到包含表的页面时,ViewController调用一个函数,该函数通过HTTP请求从服务器获取数据,并在NSMutableArray中解析数据 现在我的问题来了。我设法将此数组发送到我的UITableViewController,但当我想刷新我的table

每次导航包含此表的视图时,我都试图刷新
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

}

在使用tableViewController时,您应该能够使用
self.tableView
来像这样重新加载数据

[self.tableView reloadData];

您需要先进行合成,然后才能使用self.myTable

在上面做什么

@synthesize myTable
然后

[self.myTable reloadData];

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

代码中的一些问题:

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

  • 您也在使用interface builder,因此如果您确实想创建自己的子视图,您应该在IB中创建子视图并在那里设置插座,或者在代码中创建子视图,这意味着在
    viewDidLoad
    中创建子视图,然后使用
    [view addSubview:mySubView]
    将它们添加到视图中

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

  • 对于
    tableView:cellforrowatinexpath:
    中引用的
    listenom
    属性,不显示任何init/alloc。您是否打算改用
    数据

  • 您的
    MyTableController.m
    文件是否为完整版本?如果是这样,则缺少
    viewDidUnload
    dealloc
    方法。两者都是必需的
    viewDidUnload
    应释放
    viewDidLoad
    中分配的任何对象,
    dealloc
    应释放控制器保留的任何对象(包括
    viewDidUnload
    中释放的对象)


  • 首先感谢您的回复。重新加载现在经过numberofsections和numberOfRowsInSection,但仍然从未调用cellForRowAtIndexPath。我检查了,NumberOfRowsInSections返回数组的大小。我更新了我的帖子,添加了一些代码以提供帮助,但我实际上认为问题在于我没有正确设置数据库。再次感谢您前进!欢迎使用SO!我已在您的帖子中修改了代码的格式,因此人们可以更轻松地使用它。将来,“>”可以突出显示一行代码,但要执行块,您需要选择它并点击“{}”按钮。谢谢!当我看到我自己的消息时,我有点尴尬,下次我一定会尝试更正确地编写代码。@Mathiew-不用担心。你应该看到我的第一篇文章!很可能是因为return[data count];returns 0…我添加了一个NSLog来检查[data count]的值,并返回我要在表中显示的数组的大小。如果我在ViewDidLoad函数的数组中添加了一些项,则在应用程序启动时调用CellForRowatineXpath,但在重新加载数据时不会调用,即使[data count]的值已更新。我是否忘记了将数组设置为表数据库?