13

我有一个包含 UITableView 的 UIView。tableview 的委托设置为我的 UIView,但它从不调用委托方法:

-(id)init {
    self = [super init];
    if (self) {
        self.tableView = [[UITableView alloc] initWithFrame:self.bounds];
        self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        self.tableView.scrollEnabled = NO;
        self.tableView.layer.cornerRadius = PanelCornerRadius;
        [self addSubview:self.tableView];
    }
    return self;
}

#pragma mark - UITableViewDelegate methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"height for row");
    int height = [self heightForRowAtIndexPath:indexPath];

    return height;
}

#pragma mark - UITableViewDataSource methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog(@"number of rows");
    if (self.manager.fetchOperation.dataFetchProblem) {
        return 1;
    }

    int numberOfRows = [self.delegate numberOfSectionsInPanel:self];

    return numberOfRows;
}

我已经探索了我能想到的每一个选项,但似乎无法找到问题的根源。

编辑:包括 numberOfRowsInSection。它可能会返回 0,只是它永远不会有这个机会,因为“行数” NSLog 永远不会被调用。

4

8 回答 8

22

你能写下你在 cellForRowAtIndexPath: 方法上写的代码吗?因为我找不到你的代码有什么问题。

你是从其他 ViewController 调用你的 UIView 吗?如果是,如何?

我曾经做过一次这样的事情。我在 UIView 中声明了一个方法,如下所示:

- (void)setUpTableView{
    self.tableview.delegate=self;
    self.tableview.dataSource=self;
}

然后我从视图控制器调用 setUpTableView 我添加了这个视图,像这样:

[self.yourView setUpTableView]; 

这可能会有所帮助。谢谢。

于 2013-09-24T10:06:26.123 回答
16

我有一个类似的问题,我的解决方案是因为我没有将节数设置为 1。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}
于 2014-08-18T18:44:26.203 回答
3

你不需要使用 UIViewController,那只是一个烟幕。您也不需要添加到 .h,尽管无论如何您都应该这样做,否则 Xcode 会报错,而且您不会让方法名称自动完成。

我刚刚编写了一个在普通 UIView 中嵌入表格视图的测试项目,它工作正常。只需确保正在调用您的初始化代码。我打赌你需要把它移到 awakeFromNib。

于 2013-09-23T23:43:18.987 回答
3

你应该这样声明你的观点 @interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

顺便说一句:我会有一个 ViewController 来“控制”你的视图和你的 tableview,并让 ViewController 成为 table view 的委托和数据源。

于 2013-09-23T22:52:29.950 回答
1

我曾经遇到过同样的问题,我犯的愚蠢错误是在我称之为 [super init] 的 initWithCoder 中。TableView 在 xib

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super init]
}

代替

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
}

只需检查是否不是这种情况

于 2015-03-13T00:24:30.123 回答
1

尝试这个:

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

我也有这个愚蠢的问题

于 2017-09-08T21:47:39.787 回答
0

尝试改变你的UIViewtoUIViewController和 in viewDidLoad,打电话

[[UITableView alloc] initWithFrame:style:]创建您的表视图。

像上面一样将 self 设置为委托和数据源,然后将此 UITableView 作为子视图添加到此控制器中。

于 2013-09-23T23:22:53.347 回答
0

我不小心将我tableViewallowsSelection属性设置为false.

故事板解决方案

选择您的表格视图并设置以下... 在此处输入图像描述

迅捷解决方案

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.allowsSelection = true
}

笔记

  1. 起初,我认为这是一个UITableViewDelegate问题(正如其他答案所建议的那样)。不是。我将它链接到我的故事板中的视图控制器。
  2. 接下来,我认为这是一个UITableViewDataSource问题,因为我没有实现协议的numberOfSections(in tableView:)方法(正如其他答案所建议的那样)。不是。根据 UIKit 的文档,

// 如果没有实现,默认为 1

  1. 最后,我检查了我的表格视图上的设置:]
于 2019-09-10T14:56:03.923 回答