UITableView 方法没有触发
Posted
技术标签:
【中文标题】UITableView 方法没有触发【英文标题】:UITableView methods not firing 【发布时间】:2013-03-21 13:14:15 【问题描述】:我有一个带有 UITableView 控件的简单表格视图控制器。我已经在我的头文件中实现了 UITableViewDelegate 和 UITableViewDatasource 。我已将数据源和委托指定为包含 UITableView 的 ViewController。但是,没有一个表视图方法被触发。我已经发布了精简的源代码和显示委托/数据源的屏幕截图。事件未连接的可能原因是什么?
(gauges 是一个包含值对象的 NSArray 的模型)
标题
#import <UIKit/UIKit.h>
#import "GaugeList.h"
@interface SitePickerViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic,strong) GaugeList *gauges;
@end
实施
#import "SitePickerViewController.h"
@interface SitePickerViewController ()
@end
@implementation SitePickerViewController
@synthesize gauges;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
return self;
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSInteger rowCount = [gauges.gaugeList count];
NSLog(@"numberOfRowsInSection called: %i\n", rowCount);
return rowCount;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"cellForRowAtIndexPath\n");
UITableViewCell *cell = [[UITableViewCell alloc] init];
return cell;
-(void)loadView
gauges = [[GaugeList alloc] initWithStateIdentifier:@"WV" andType:nil];
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"viewDidLoad called: %i\n", [gauges.gaugeList count]);
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
@end
【问题讨论】:
你钩对了吗? 委托和数据源函数的挂钩好像有问题 GaugeList 是一个值对象的 NSArray。你继承了 NSArray?你为什么这样做?疼吗? 我正在使用情节提要并已映射 tableview 数据源并委托给 ViewController。我试图发布它的图片,但由于我是新来的,所以不允许。添加图片链接,我会将其添加为图片 您是否在 IB 中为场景指定了正确的视图控制器类? 【参考方案1】:问题在于您对loadView
的实现。 loadView
的任何实现必须实际为控制器创建主视图并将其分配给self.view
。正如您所拥有的那样,最终不会为您的视图控制器创建任何视图。
将你必须的方法调用移动到viewDidLoad
。
- (void)viewDidLoad
[super viewDidLoad];
gauges = [[GaugeList alloc] initWithStateIdentifier:@"WV" andType:nil];
// Do any additional setup after loading the view.
NSLog(@"viewDidLoad called: %i\n", [gauges.gaugeList count]);
【讨论】:
【参考方案2】:在 viewDidLoad 中
设置
tableView.delegate = self;
如果你不使用XIB,还要分配tableView。或者,如果您使用 xib 将委托和数据源映射到文件所有者
【讨论】:
也设置tableView.dataSource = self;
我正在使用情节提要并已映射 tableview 数据源并委托给 ViewController。我试图张贴那张照片,但由于我是新来的,所以不允许。我是否还需要将 tableview 设置为 outlet?
添加图片链接,我添加为图片【参考方案3】:
将 SitePickerViewController 设为委托和数据源还不够。您还必须将该类设置为数据源和委托。确保也连接到该 IBOutlet。
@interface <UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *functionTableView;
@end
@implementation
- (void)viewDidLoad
[super viewDidLoad];
self.functionTableView.delegate = self;
self.functionTableView.dataSource = self;
//Delegate and datasource methods down here
@end
【讨论】:
谢谢,我试过了,但仍然唯一要调用的方法是 viewDidLoad 我还尝试将它放在 loadView 方法中,该方法在 viewDidLoad 之前被调用。但是,结果是一样的。 这不可能不工作。可能你在其他地方有错误。 您是否映射控件拖动表格视图以将其从情节提要中连接到 IBOutlet,我没有为情节提要中的表格视图连接数据源和委托,而是选择执行而是手动进行,如上所示。以上是关于UITableView 方法没有触发的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 删除行,commitEditingStyle 方法没有触发?