2011-03-11 154 views
2

我试图刷新一个UITableView每次我浏览包含此表的视图时。UITableView刷新问题

我有一个ViewController和一个自定义UITableViewController,它管理在应用程序启动时使用包含在控制器内的NSMutableArray正确设置表。

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

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

我试图使用[myTable reloadData],但它不调用numberOfRowsInSection或cellForRowAtIndexPath函数。只见那人同样的问题,解决它使用[self.myTable ReloadData],但我得到一个错误:

访问未知的getter/setter方法

我非常新的目标-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 

} 
+0

欢迎这样的!我固定的代码的格式在您的文章,以便更容易为人们未来,“>”很好地突出显示一行代码,但要做一个块,您需要选择它并点击表格顶部的“{}”按钮。 – 2011-03-11 15:58:33

+0

谢谢!当我看到我自己的消息时,我有点尴尬,我一定会在下次更正确地写我的代码。 – 2011-03-11 16:12:21

+0

@Mathiew - 别担心,你应该看到我的第一篇文章! – 2011-03-11 17:29:18

回答

2

你有很多的这个代码示例中的问题。在这里我要指出几个人,但我强烈建议在阅读苹果的相关文件:在你的代码

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的子类,因此不需要属性和p robery为myTableViewtableView属性被定义并初始化为UITableViewController实现的一部分,其dataSource和delegate设置为UITableViewController实例。这就是为什么[self.tableView reloadData]调用你的委托和数据源协议方法。

  2. 您还使用界面生成器,所以如果你确实想创建自己的子视图您应该做内IB这一点,设置出口那里或做在你的代码这意味着viewDidLoad创建子视图(S)和然后用[view addSubview:mySubView]将它们添加到您的视图中。

  3. 一种更好的方式来设置数据表格将您data属性创建一个属性,并从已初始化的MyTableController实例的视图控制器打电话setData。您可以使用setData:方法来执行此操作。您可以致电[self.tableView reloadData]setData。当视图被加载时,您不需要显式重新加载表格,因为这是自动完成的。更小的一点,如果你留在EditTable我会重命名为更具描述性,并使用骆驼大小写(例如setDataForTable`)以符合iOS约定。

  4. 您不会显示tableView:cellForRowAtIndexPath:中引用的listenom属性的任何init/alloc。你是否想用data代替?

  5. 您的MyTableController.m文件是完整版吗?如果是这样,那么您缺少viewDidUnloaddealloc方法。这两者都是必需的。 viewDidUnload应该释放viewDidLoad分配的任何对象,并dealloc应该释放任何控制器(包括viewDidUnload发布对象保留。

0

当您使用tableViewController你应该能够使用self.tableView,而不是重新加载数据像这样

[self.tableView reloadData]; 
0

你需要首先综合然后你可以使用自我.myTable

做顶部

@synthesize myTable 

然后

[self.myTable reloadData]; 
+0

首先感谢您的回复。重载现在通过numberofsections和numberOfRowsInSection,但仍然不会调用cellForRowAtIndexPath。我检查和NumberOfRowsInSections返回我的数组的大小。我更新了我的帖子以添加一些代码来帮助,但我实际上认为问题是我没有正确设置数据库。提前再次感谢您! – 2011-03-11 15:40:33