男式,
我需要一些帮助。这几乎就像我知道我正在尝试做什么,但在编码时我一直无法使它工作。场景是我有一个视图控制器,其中包含一个表视图。我的表视图有三种不同的动态原型,因为我有三种不同的单元格。现在,我想要做的就是指定在哪一行中生成哪个原型单元格。我还在故事板中给出了每个原型单元的唯一标识符。
我理解的方法是我的cellforRowatIndexpath方法需要了解在该行中显示哪种类型的单元格,然后选择标识符,出列并根据需要设置内容。
相应地,这是我正在尝试做的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath * )indexPath
{
if(indexPath.row==0)
{
static NSString *CellIdentifier = @"HelloCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// configure your cell here...
return cell;
}
}
不幸的是,事情没有按计划运行,我的应用程序崩溃给了我一个 2013-02-07 16:47:39.859 ProjectsABC30068:c07] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [NSIndexPath setTableViewStyle:]:无法识别的选择器发送到实例0x83812e0'错误。
由于我已正确设置数据源和委托,因此表视图没有问题。并且还为表格视图提供了一个出口。
我还尝试将cellforRowAtIndexPath中的if语句更改为if(myTable.indexPathForSelectedRow == 0)。这会在所有单元格中生成动态原型,但至少应用程序不会停止。
你们认为这是什么问题?
我不知道如何正确使用索引路径,如果有人可以帮助我,我会很感激。
答案 0 :(得分:7)
使用Storyboard和Dynamic原型单元格,您无需担心或检查dequeueReusableCellWithIdentifier:
是否返回零单元格。
你需要做什么:
dequeueReusableCellWithIdentifier:
我们有一个例子。假设您有三个原型单元格,标识符为“Cell1”,“Cell2”和“Cell3”。并假设您有三行,每行都显示一个原型单元格。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier = [NSString stringWithFormat:@"Cell%d", indexPath.row + 1];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
cell.textLabel.text = identifier; // just show the identifier as title
return cell;
}
答案 1 :(得分:2)
你说它在报道:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSIndexPath setTableViewStyle:]:无法识别的选择器发送到实例0x83812e0
当cellForRowAtIndexPath
未返回有效的UITableViewCell
时,您就会收到此消息。
您从tableView:numberOfRowsInSection:
返回的价值是多少?我问的原因是你的cellForRowAtIndexPath
除了第一行之外的任何一行都会失败。如果您的tableView:numberOfRowsInSection:
指示的值大于1,则您的应用会崩溃。
要确认这一点,您可以通过在方法开头添加此行来检查indexPath
开头cellForRowAtIndexPath
的内容:
NSLog(@"%s: section = %d; row = %d", __FUNCTION__, indexPath.section, indexPath.row);
通过这种方式,您可以确定要为其生成单元格的行以及正确处理它的行。
后来你说:
我还尝试将cellforRowAtIndexPath中的if语句更改为if(myTable.indexPathForSelectedRow == 0)。这会在所有单元格中生成动态原型,但至少应用程序不会停止。
这肯定不起作用,这意味着对cellForRowAtIndexPath
的工作方式的混淆。它与当前选定的单元格无关。您回复numberOfSectionsInTableView
和tableView:numberOfRowsInSection:
,告诉它您可以创建哪些单元格,然后iOS会针对其确定的每个单元格重复调用cellForRowAtIndexPath
给定的数量部分和行数。
确保您的numberOfSectionsInTableView
和tableView:numberOfRowsInSection:
方法仅返回您在cellForRowAtIndexPath
中正确处理的值。
如需进一步阅读,我建议您浏览Table View Programming Guide for iOS或google“UITableView教程”。
答案 2 :(得分:1)
(这有点长,可以留作评论,所以我把它放在这里,即使它没有直接回答这个问题)
异常BreakPoint:
转到断点导航器
在导航器的底部,您有“+”按钮
然后它会添加一个断点供您自定义,只需点击完成即可设置
现在,当抛出异常时,您将被带到触发异常的行。最重要的是,你将能够看到你那个时刻的整个电话堆栈。对调试非常有用。
自4.2以来,Xcode中的断点可以完成更多“时髦”的东西(不确定的确切时间)