ios - 未在 UITableViewController 子类中调用 UiTableViewController 委托(delegate)方法

标签 ios

为什么不调用 numberOfSectionsInTableView 方法?如果我在 viewDidLoad 中添加 [self.tableView reloadData],它就会被调用,但即便如此,cellForRow 也不会被调用。

编辑:我更新了以下代码来为 UITableViewCell 注册 Nib 。

UIViewController 中,我有:

- (void)viewDidLoad
{
    [super viewDidLoad];        
    XXFeedTableViewController *tableViewController = [[XXFeedTableViewController alloc] initWithStyle:UITableViewStylePlain];
   tableViewController.view.frame = self.view.bounds;
   [self addChildViewController:tableViewController];
}

XXFeedTableViewController.h

@interface XXFeedTableViewController : UITableViewController
@end

XXFeedTableViewController.m

#import "XXFeedTableViewController.h"
#import "XXFeedTableViewCell.h"

@interface XXFeedTableViewController ()

@end

@implementation XXFeedTableViewController

- (id)initWithStyle:(UITableViewStyle)style {
    self = [super initWithStyle:style];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerNib:[UINib nibWithNibName:@"XXFeedTableViewCell" bundle:nil] forCellReuseIdentifier:@"XXFeedTableViewCell"];
}

#pragma mark - Table view data source

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"XXFeedTableViewCell";
    XXFeedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.textLabel.text = @"Hey";
    return cell;
}

@end

Apple 文档说:

If no nib file is specified or if the nib file defines no data source or delegate, UITableViewController sets the data source and the delegate of the table view to self. When the table view is about to appear the first time it’s loaded, the table-view controller reloads the table view’s data.

最佳答案

试试这个,看看它是否有效。这是 Apple 现在推荐的基于 Nib 的电池的方式。

-(void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerNib:[UINib nibWithNibName:@"XXFeedTableViewCell" bundle:nil] forCellReuseIdentifier:@"XXFeedTableViewCell"];
}

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"XXFeedTableViewCell";
    ROFeedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.textLabel.text = @"Hey";
    return cell;
}

编辑后:

在您的初始 Controller 中,您应该在添加其 subview 之前将 TableView Controller 添加为子 Controller :

   XXFeedTableViewController *tableViewController = [[XXFeedTableViewController alloc] initWithStyle:UITableViewStylePlain];
   self addChildViewController:tableViewController];
   tableViewController.view.frame = self.view.bounds; 
   [self.view addSubview:tableViewController.view]; 
   [tableViewController didMoveToParentViewController:self];

关于ios - 未在 UITableViewController 子类中调用 UiTableViewController 委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17690768/

相关文章:

ios - 使用 Firebase/Google Cloud Functions 推送通知

ios - 无法在 Swift 中调用特定的 Objective-C 类方法

objective-c - 在 iOS 中更改 ViewControllers 和传递数据

ios - 有没有一种方法可以使用户创建一个复选框列表,以便用户可以编辑该复选框的标签?例如,需要完成的任务

ios - 为什么 NSURLSession dataTaskWithURL 比 NSData dataWithContentsOfURL 慢很多?

ios - Swift:继承 UITextView 或 UICollectionView 并正确初始化

iphone - Storyboard完成,我需要为每个创建的 View 创建 .h 和 .m View Controller 文件吗?

iOS:如何为应用程序的所有 ImageView 设置 'accessibilityIgnoresInvertColors' 为真?

ios - 使用 NSMutableData iOS 进行键值观察

ios - 识别iOS上的模式