【问题标题】:When placing a UITableView inside UIView the cellForRowAtIndexPath is never hit在 UIView 中放置 UITableView 时,永远不会命中 cellForRowAtIndexPath
【发布时间】:2014-01-10 21:59:31
【问题描述】:

我进行了一些广泛的研究,并意识到使用普通 UITableViewController 时的陷阱。我还发现了类似的questions,但没有任何运气。我一定错过了一些非常琐碎的事情。

我已经在 Github 上上传了test project

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

我有一个 xibfile 并将文件的所有者设置为我的视图控制器,并将所有内容连接起来。

@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 有关,但我不确定我接线错了什么。

【问题讨论】:

    标签: ios uitableview uiview ios7


    【解决方案1】:

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

    编辑后:

    右键单击文件的所有者以打开黑色窗口。正如您从图像中看到的,“视图”连接到表视图。单击该行上表视图旁边的“x”以删除该连接,然后从右侧的开放圆圈拖动到显示“视图”的位置(就在 First Responder 立方体下方)。

    【讨论】:

    • 感谢您的回复。我不确定我是否关注您,请您详细说明The view outlet should be connected to the main view 或提供屏幕截图如何连接它们?或者随意更改项目并提交更改。什么都容易。谢谢
    • 这是我的错误。非常感谢你澄清它。我原以为问题出在接线上,但无法弄清楚到底哪里出了问题。 +1
    【解决方案2】:

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

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

    【讨论】:

    • 为什么在界面里? IBOutlet UITableView *myTable;你能把它声明为一个属性吗?@property (strong, nonatomic) IBOutlet UITableView *myTable;然后在 reloadData 之前的某个地方,调用设置委托和数据源 - [self.myTable setDelegate:self]; [self.myTable setDataSource:self];
    • 谢谢。我将其从界面中删除并将其添加为@property (strong, nonatomic) IBOutlet UITableView *myTable;viewDidAppear 中,我在重新加载之前设置了委托和数据源,同样的问题。您是否尝试过该项目以查看它是否适合您?
    【解决方案3】:

    只需正确地为 View nd 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;
    
    }
    

    【讨论】:

      【解决方案4】:

      交叉检查您的 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];
           ...
      } 
      

      【讨论】:

      • initWithNibNameviewDidLoad 方法和 tableview 数据源方法中放置断点 - numberOfSectionsInTableViewnumberOfRowsInSectioncellForRowAtIndexPath 如果在视图加载时调试器在所有这些函数中停止。它应该停止所有这些方法。
      • 它只在initWithNibNameviewDidLoad 中断,而不是在其他方法中。
      【解决方案5】:

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

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

      是否需要重新加载数据?

      【讨论】:

      • 感谢您的帮助。我已经尝试过了,没有任何运气。我做了一个简单的项目来演示这个问题。 github.com/houmie/iTestTable
      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多