2

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

}
4

3 回答 3

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 和委托设置为 UITableViewController 实例。这就是 [self.tableView reloadData] 调用您的委托和 dataSource 协议方法的原因。

  2. 您还在使用界面构建器,因此如果您确实想创建自己的子视图,您应该在 IB 中执行此操作并在那里设置插座,或者在您的代码中执行,这意味着在其中创建子视图viewDidLoad,然后将它们添加到您的视图中与[view addSubview:mySubView].

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

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

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

于 2011-04-06T05:17:38.113 回答
0

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

[self.tableView reloadData];
于 2011-03-11T09:57:06.527 回答
0

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

在顶部做

@synthesize myTable

进而

[self.myTable reloadData];
于 2011-03-11T10:00:21.140 回答