在UIView中放置UITableView时,永远不会命中cellForRowAtIndexPath

时间:2014-01-10 21:59:32

标签: ios uitableview uiview ios7

我做了一些广泛的研究,并且意识到使用普通UITableViewController时的陷阱。我也发现了类似的questions,但没有任何运气。我必须遗漏一些非常微不足道的东西。

我已在Github上传了test project

我的目标是将UITableView放在UIView中。

enter image description here

我有一个xib文件,并将文件的所有者设置为我的viewcontroller,并将所有内容连接起来。

@interface TNViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

这就是视图控制器的实现方式。

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"TNViewController" bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }    
    return cell;
}

在App委托中,我正在运行它:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    TNViewController *vc = [TNViewController new];
    [[self window] setRootViewController:vc];
     ...
}

然而,该表保持为空并且cellForRowAtIndexPath永远不会被击中。它必须与UIView包装表有关,但我不确定我错误连接了什么。

5 个答案:

答案 0 :(得分:3)

查看您的测试项目,您错误地将文件所有者的myTable和视图出口连接到表视图。视图插座应连接到主视图(这更容易连接到对象列表中的视图而不是画布上的视图)。当然,要查看表格中的任何内容,您需要向单元格添加一些内容。

编辑后:

enter image description here

右键单击文件所有者以显示黑色窗口。从图像中可以看出,“视图”与表格视图相连。单击该行表格视图旁边的“x”以删除该连接,然后从右侧的空心圆圈拖到“查看”(位于第一响应者多维数据集下方)的位置。

答案 1 :(得分:1)

我快速查看了您的代码,但没有看到您设置委托或数据源。在致电reloadData之前尝试添加以下行,看看是否cellForRowAtIndexPath被调用...

[uitableview setDelegate:self];
[uitableview setDataSource:self];

答案 2 :(得分:1)

正确地为View和TableView制作Outlet ...你还没有在你的测试项目中完美地连接它... 并改变这种方法

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 }

// Configure the cell...

cell.textLabel.text=@"hello";

return cell;

}

答案 3 :(得分:0)

交叉检查您的xib名称是否为@“TNViewController”(应与下面的对象初始化期间使用的相同)并更正此功能

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

并检查此函数中的TNViewController初始化行。

 (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    TNViewController *vc = [[TNViewController alloc] initWithNibName:@"TNViewController" bundle:nil];
    [[self window] setRootViewController:vc];
     ...
} 

答案 4 :(得分:0)

如果可以,我会将此作为评论。

来自UITableView的类引用: UITableView会覆盖UIView的layoutSubviews方法,以便仅在创建UITableView的新实例或分配新数据源时才调用reloadData。重新加载表视图会清除当前状态,包括当前选择。但是,如果显式调用reloadData,它将清除此状态,并且对layoutSubviews的任何后续直接或间接调用都不会触发重新加载。

你需要重新加载数据吗?