UITableView委托和dataSource方法没有被调用

时间:2013-09-23 22:34:45

标签: iphone ios objective-c uitableview

我有一个包含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永远不会被调用。

8 个答案:

答案 0 :(得分:16)

你能写一下你在cellForRowAtIndexPath:方法上写的代码吗?因为我发现你的代码没有任何问题。

你是否从其他ViewController调用你的UIView?如果是,怎么样?

我做过这样的事情一次。我在UIView中声明了一个方法:

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

然后我从视图控制器调用setUpTableView我添加了这个视图,如下所示:

[self.yourView setUpTableView]; 

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

答案 1 :(得分:14)

我有类似的问题,我的解决方案是因为我没有将部分数量设置为1。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

答案 2 :(得分:3)

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

BTW:我会有一个“控制”你的视图和你的tableview的ViewController,并让ViewController成为表视图的委托和数据源。

答案 3 :(得分:3)

您不需要使用UIViewController,这只是一个烟幕。你也不需要添加到.h,尽管你应该这样做,因为Xcode会抱怨,否则你不会自动完成方法名称。

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

答案 4 :(得分:1)

我曾经遇到过同样的问题,我在initWithCoder里面犯了什么愚蠢的错误我叫[super init]。 TableView在xib中

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

而不是

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

检查是否不是这种情况

答案 5 :(得分:1)

试试这个:

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

我也有这个愚蠢的问题

答案 6 :(得分:0)

尝试将UIView更改为UIViewController,然后在viewDidLoad中将

更改为

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

将self设置为与上面一样的委托和数据源,然后在此Controller中将此UITableView添加为Subview。

答案 7 :(得分:0)

我不小心将tableView的{​​{1}}属性设置为allowsSelection

故事板解决方案

选择表格视图并设置以下内容... enter image description here

快速解决方案

false

注释

  1. 起初,我认为这是一个override func viewDidLoad() { super.viewDidLoad() tableView.allowsSelection = true } 问题(如其他答案所建议)。不是。我将其链接到情节提要中的视图控制器。
  2. 接下来,我认为这是一个UITableViewDelegate问题,因为我没有实现协议的UITableViewDataSource方法(如其他答案所建议)。不是。根据UIKit的文档,
  

//如果未实现,则默认为1

  1. 最后,我在表格视图中检查了设置:]