我做了一些广泛的研究,并且意识到使用普通UITableViewController
时的陷阱。我也发现了类似的questions,但没有任何运气。我必须遗漏一些非常微不足道的东西。
我已在Github上传了test project。
我的目标是将UITableView放在UIView中。
我有一个xib文件,并将文件的所有者设置为我的viewcontroller,并将所有内容连接起来。
@interface TNViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
这就是视图控制器的实现方式。
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:@"TNViewController" bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (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];
}
return cell;
}
在App委托中,我正在运行它:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
TNViewController *vc = [TNViewController new];
[[self window] setRootViewController:vc];
...
}
然而,该表保持为空并且cellForRowAtIndexPath
永远不会被击中。它必须与UIView包装表有关,但我不确定我错误连接了什么。
答案 0 :(得分:3)
查看您的测试项目,您错误地将文件所有者的myTable和视图出口连接到表视图。视图插座应连接到主视图(这更容易连接到对象列表中的视图而不是画布上的视图)。当然,要查看表格中的任何内容,您需要向单元格添加一些内容。
编辑后:
右键单击文件所有者以显示黑色窗口。从图像中可以看出,“视图”与表格视图相连。单击该行表格视图旁边的“x”以删除该连接,然后从右侧的空心圆圈拖到“查看”(位于第一响应者多维数据集下方)的位置。
答案 1 :(得分:1)
我快速查看了您的代码,但没有看到您设置委托或数据源。在致电reloadData
之前尝试添加以下行,看看是否cellForRowAtIndexPath
被调用...
[uitableview setDelegate:self];
[uitableview setDataSource:self];
答案 2 :(得分:1)
正确地为View和TableView制作Outlet ...你还没有在你的测试项目中完美地连接它... 并改变这种方法
-(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];
}
// Configure the cell...
cell.textLabel.text=@"hello";
return cell;
}
答案 3 :(得分:0)
交叉检查您的xib名称是否为@“TNViewController”(应与下面的对象初始化期间使用的相同)并更正此功能
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
并检查此函数中的TNViewController
初始化行。
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
TNViewController *vc = [[TNViewController alloc] initWithNibName:@"TNViewController" bundle:nil];
[[self window] setRootViewController:vc];
...
}
答案 4 :(得分:0)
如果可以,我会将此作为评论。
来自UITableView的类引用: UITableView会覆盖UIView的layoutSubviews方法,以便仅在创建UITableView的新实例或分配新数据源时才调用reloadData。重新加载表视图会清除当前状态,包括当前选择。但是,如果显式调用reloadData,它将清除此状态,并且对layoutSubviews的任何后续直接或间接调用都不会触发重新加载。
你需要重新加载数据吗?