1

这是一个博客类型的应用程序,其中显示了博客文章,您可以在下面阅读对该文章的几条评论。

| Post Title Here
|
| Post text here lorem ipsum 
| dolor bla bla bla
|
| ---------------------------------------------
| Comment 1
| ---------------------------------------------
| Comment 2
| ---------------------------------------------
| Comment 3
| ---------------------------------------------
| etc

我的 JSON 提要如下所示:

...
{
    "post_id": "1463",
    "post_title": null,
    "post_text": "dffsdjdflkjklk dlfkjsdlfkj",
    "comment": [
        {
            "comment_id": "2162",
            "comment_text": "yuiyuiiopiop",
        },
        {
            "comment_id": "2163",
            "comment_text": "tyutyutyutyuu",
        },
        {
            "comment_id": "2164",
            "comment_text": "sdfsertertr",
        },
    ]
},
...

这就是我读它的方式

NSDictionary *post           = self.detailItem;
NSArray      *commentThread  = [post objectForKey:@"comment"];
NSUInteger   commentCount    = [commentThread count];

    for (int i = 0; i < commentCount; i++) {
        NSDictionary *comment      = [commentThread objectAtIndex:i];
        NSString     *commentText  = [comment objectForKey:@"comment_text"];

        commentTextLabel.text  = commentText;
    }

在我的故事板中,我有一个连接到commentTextLabel.

使用上述方法,我认为只有最后一条评论显示。我预计 UILabel 会生成i时间,但似乎并非如此。

我应该怎么做才能创建多个 UILabel,每个评论一个,所以它们最终会堆积如我在这篇文章顶部显示的那样?

非常感谢任何形式的帮助、指示或建议。

4

2 回答 2

2

由于您在情节提要中连接了一个 UILabel,因此您在每次迭代中都会覆盖它的内容。

您要做的是为每个评论创建一个新的 UILabel,设置它的框架并将其作为子视图添加到它的父视图并迭代到下一个。

例如:

for (int i = 0; i < commentCount; i++) {
    NSDictionary *comment      = [commentThread objectAtIndex:i];
    NSString     *commentText  = [comment objectForKey:@"comment_text"];
    UILabel      *newLabel     = [UILabel alloc] init];

    newLabel.text = commentText;
    newLabel.frame = CGRectMake(origin.x, origin.y, width, height);
    [self.view addSubview:newLabel];
}

origin.x, origin.y 每次都必须计算以满足您的需要,您可以插入一个变量来保存最后一个 origin.y 并每次添加它的高度和边距以使其看起来像一个列表。

另一方面,最有效的方法是使用 UITableView。您的 JSON 可以解析为一个数组,每个条目都是一个单元格。这样您就可以利用重用单元格。如果您不重复使用单元格并继续使用当前设置,如果您有太多评论,您的应用程序的性能可能会受到影响。

还要考虑到在 TableView 或 ScrollView 中显示标签在帧率方面不是很有效。阿尔法混合会影响你的表现。我建议你也用谷歌搜索 tweetie 的快速执行 tableviews 或查看这篇文章 atebits Twitter fast scrolling

于 2012-10-16T01:20:56.233 回答
1

您可能应该将 替换UILabelUITableViewController. 这样,您可以将commentThread数组直接传递给UITableViewController(通过您将创建的自定义属性)。然后UITableViewController将能够通过其数据源方法(您必须实现)遍历数组。

正如您目前拥有的那样,您不会为循环的每次迭代创建一个新标签。您所做的只是设置您连接的 1 标签的文本。如果您真的想使用标签,请连接一个UIView作为标签容器的容器,然后在您的 for 循环中创建标签并将它们添加到UIView您在情节提要中创建的标签中。

我的两分钱:)

于 2012-10-16T00:31:41.240 回答