无法正确声明/实现UITableViewDataSource方法

时间:2012-05-28 13:28:55

标签: objective-c cocoa-touch uitableview

我想要使用UIViewController来实现UITableViewDataSource的方法。我有这个标题,FriendsController.h

#import <UIKit/UIKit.h>
@interface FriendsController : UIViewController <UITableViewDataSource>
@end

修改现在将@interface声明更新为:

@interface FriendsController : UIViewController <UITableViewDataSource, UITableViewDelegate>

此实施,FriendsController.m

#import "FriendsController.h"

@implementation FriendsController

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section
{
  // Return the number of rows in the section.
  NSLog(@"CALLED .numberOfRowsInSection()");
  return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSLog(@"CALLED cellForRowAtIndexPath()");
  UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:@"FriendCell"];
  cell.textLabel.text = @"Testing label";
  return cell;
}
@end

运行时,这会给我一个'-[UIView tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x81734d0'。任何人都可以看到我的.numberOfRowsInSection()的实现/声明是否有问题?

修改:我添加了一种方法列表技术here并运行视图'未连接',它输出以下列表:

[<timestamp etc>] Method no #0: tableView:numberOfRowsInSection:
[<timestamp etc>] Method no #1: tableView:cellForRowAtIndexPath:
[<timestamp etc>] Method no #2: numberOfSectionsInTableView:
[<timestamp etc>] Method no #3: tableView:didSelectRowAtIndexPath:
[<timestamp etc>] Method no #4: viewDidLoad

Post scriptum: @ThisDarkTao和@Pei都做对了,我在上一个记录视觉部分的问题中可以看到here

2 个答案:

答案 0 :(得分:1)

您需要将UITableViewDelegate添加到接口文件中的协议列表中,如下所示:<UITableViewDataSource, UITableViewDelegate>

您还需要以下所有委托方法:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1; // Number of rows
}

- (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];
    }

    cell.textLabel.text = @"Test Cell";

    return cell;
}

在xib / storyboard视图中,还需要将tableview的委托和数据源连接连接到viewcontroller。

如果您希望细胞在点击它们时“做某事”,您还需要实现以下委托方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Tapped cell %d",indexPath.row);     
}

答案 1 :(得分:1)

如果您在项目中使用Storyboard,则必须将UIViewController的Class字段设置为故事板Identity Inspector上的“FriendsController”。 因此,您可以展示您的UIVIewController以使用正确的课程(在本例中为FriendController)。