2012-08-01 42 views
2

填充一个UITableView我有这样的代码:IOS - 挣扎着从一个NSArray

@interface MyBusinessesController : UIViewController 
{ 
    NSDictionary *businesses; 
    NSArray *items_array; 
} 
@property (weak, nonatomic) IBOutlet UILabel *messageLabel; 
- (IBAction)plan:(id)sender; 

@property (weak, nonatomic) IBOutlet UITableView *itemList; 

@end 

,我设置的UITableView和NSArray的在.m文件的头部区域。然后我有一个远程服务器调用并返回JSON。我得到的JSON数据到一个数组是这样的:

for (int i = 0; i<= items_array.count - 1; i++) 
{ 
    NSDictionary *dict = [items_array objectAtIndex:i]; 

    NSString *item_title = [dict objectForKey:@"item_title"]; 
    NSString *item_id = [dict objectForKey:@"item_id"]; 
    ... 

,然后我想将其添加为一个排在我的UITableView,但:

items_array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 

然后,我通过这样的项目环我现在正在努力如何去做。

我想要的是将item_title显示给用户,当用户按下标题时,我将能够知道如何获取item_title的item_id。

谢谢!

回答

1

除了循环访问数组并取出字符串值外,您可以让UITableView的数据源方法处理这个问题。所以在的cellForRowAtIndexPath方法,你能指标与指数路径的items_array这样:

NSDictionary *dict = [items_array objectAtIndex:[indexPath row]]; 

,那么你会在幕后操纵了字典的喜欢你的循环没有和设置标题为单元的字符串。要选择单元格,可以在didSelectRowAtIndexPath方法中编写代码。

这是从项目我工作的一个例子:

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return [items_array count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) 
                reuseIdentifier:@"cell"]; 

    NSDictionary *dict = [items_array objectAtIndex:[indexPath row]]; 
    cell.textLabel.text = [dict objectForKey:@"item_name"]; 

    return cell; 
} 

第一种方法指定你在表中所需部分的数量。如果你想要一个非常简单的表,这将是1.第二种方法是行数。这将是items_array中的项目数量,如下所示:[items_array count]。第三种方法根据索引创建一个单元格。它将从第0节到您指定的节数,从第0行到您指定的每节节数。所以,现在,而不是循环,你可以索引你的数组。 [indexPath section]给出的段号和[indexPath row]给出的行号。 *我知道我应该在制作新单元之前将单元出队,但是我的阵列很小。

+0

谢谢..要清楚...在我创建数组后,我应该使用建议创建字典的行吗?我不太清楚如何使用它,因为据我所知,字典没有排序,我想要使用数组的原因是因为它是有序的......抱歉,仍然困惑。 – GeekedOut 2012-08-01 22:01:27

+0

如果您在问题中使用循环,字典的顺序应与您的数组的顺序相同。你需要做的是将数据源和委托协议添加到头文件中,就像@fzwo所说的那样。如果您使用的是UITableViewController,那么您已经完成了这个任务,并且您需要的方法将在实现中完成。如果您使用UIViewController,则需要编写数据源和委托的方法。 – 2012-08-01 22:05:44

+0

我要去掉循环。现在我的头声明看起来像这样@界面MyBusinessesController:UIViewController ..我改变了它感谢fzwo建议。 – GeekedOut 2012-08-01 22:08:08

2

您需要在UITableViewDataSource协议中实现所需的方法,并将tableView的dataSource属性设置为self

因此,实施适当的UITableViewDelegate方法,以及你的tableView的delegate属性设置为self

请参阅文档以了解哪些方法是必需的,以及您可能想要实现哪些可选方法。

不要忘了在.h文件来宣传你的类符合这两个协议:

@interface MyBusinessesController : UIViewController <UITableViewDataSource, UITableViewDelegate> 

您可以进行的tableView通过调用[itemList reloadData]刷新其内容。

+0

感谢,我添加接口MyBusinessesController:的UIViewController 我的.h声明。但我仍然对我需要在我的.m文件中实现哪种方法以及它应该如何调用感到困惑......抱歉 - 仍然在学习:) – GeekedOut 2012-08-01 22:03:13

+0

查看Apple的文档 - 您可以在Organizer窗口中找到它在Xcode中。 “UITableViewDataSource”的文档会告诉你有两个必需的方法。实现这些,设置'itemList.delegate = self;',调用'[itemList reloadData]',你会看到你的TableView显示的东西。为了处理已触及的单元格,请查看“UITableViewDelegate”文档,但您应该首先确定它实际显示的内容。 – fzwo 2012-08-01 22:07:53

+0

是否有一个苹果文档教程呢?你有链接吗?我一直googling和看到其他StackOverflow的问题:)顺便说一句,对[itemList reloadData]的调用 - 这是在我的函数创建数组,对吗?我今天看了一些教程,在得到这个数组之后,我很困惑,接下来要调用什么,即我需要采取的逻辑步骤。 – GeekedOut 2012-08-01 22:12:50