如何将UITableView添加到包含其他对象的父级?

时间:2012-10-17 23:43:50

标签: iphone objective-c ios uitableview ios5

这基本上就是我想要的布局:

enter image description here

底部的UITableView应该包含对特定帖子的评论,为每个评论添加一行。

底部的UITableView连接到commentTable;所有其他元素也相应地连线。

当我构建并运行时,没有错误,但我只在帖子下面看到一个空表格单元格。

我知道在将数据加载/传递到我的表格时会遗漏一些东西,但我想知道是否有人可以就如何使这项工作给我指示。

DetailViewController.h

#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController {
    IBOutlet UIImageView  *postThumbView;
    IBOutlet UILabel      *postTextLabel;
    IBOutlet UIImageView  *postAuthorPictureView;
    IBOutlet UILabel      *postAuthorNameLabel;
    IBOutlet UILabel      *postTimestampLabel;
    IBOutlet UIScrollView *scroller;
    IBOutlet UITableView  *commentTable;
}

@property (strong, nonatomic) id detailItem;
@end

DetailViewController.m

#import "DetailViewController.h"

@interface DetailViewController ()

- (void)configureView;

@end

@implementation DetailViewController;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self configureView];
}

- (void)configureView
{
    if (self.detailItem) {
        NSDictionary *post           = self.detailItem;
        NSString     *postText       = [post objectForKey:@"post_text"];
        ...

        postTextLabel.text  = postText;
        ...
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSDictionary *post           = self.detailItem;
    NSDictionary *commentThread  = [post objectForKey:@"comment"];

    return commentThread.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"commentCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

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

    NSString     *commentText       = [commentThread objectForKey:@"comment_text"];
    NSString     *commentAuthorName = [commentThread objectForKey:@"comment_author_name"];

    cell.textLabel.text = commentText;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"by %@", commentAuthorName];

    return cell;
}

@end

2 个答案:

答案 0 :(得分:1)

可能是您正在编写的表视图委托方法未被调用。您应该做的第一件事是在这些方法中设置断点,运行您的应用程序,并查看它们是否被调用。

如果他们没有被调用,您可能无法设置您的代理人。在这种情况下,您似乎没有使用离散的UITableViewController,而是试图让您的DetailViewController提供tableView按预期工作的必要信息。

首先,您需要将DetailViewController符合UITableViewDelegate协议:

@interface DetailViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

其次,您需要实际设置UITableView的委托@property。您可以在界面构建器中执行此操作(选择tableview,右键单击,拖动它的委托属性以连接到您的DetailViewController,它可能是也可能不是File的所有者)。如果您宁愿在代码中执行此操作,则只需调用(例如,在VC的生命早期,在viewDidLoad中):

self.tableView.delegate = self;
self.tableView.datasource = self;

所以...假设您的委托都已正确连接,您应该返回并测试这些断点,以查看是否正在调用表视图的方法。如果调用它们,下一步是在调用断点时评估变量,例如检查numberOfRowsInSection中返回的数字和cellForRowAtIndexPath中的值是否与您预期的相匹配。

答案 1 :(得分:0)

您需要将视图控制器声明为表视图的委托和数据源

更改.h文件

中的这一行

@interface DetailViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

然后在viewDidLoad

commentTable.dataSource = self;
commentTableView.delegate = self;
[commentTableView reloadData];
[self configureView];

您还可以查看故事板,并按照将commentTable连接到UITableView的方式连接插座,但是向相反方向拖动并选择数据源和委托