Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 多个动态原型单元的索引路径_Ios_Uitableview_Uiviewcontroller_Uistoryboard_Nsindexpath - Fatal编程技术网

Ios 多个动态原型单元的索引路径

Ios 多个动态原型单元的索引路径,ios,uitableview,uiviewcontroller,uistoryboard,nsindexpath,Ios,Uitableview,Uiviewcontroller,Uistoryboard,Nsindexpath,先生们 我需要一些帮助。这几乎就像我知道我想做什么,但我一直无法得到它的工作时,编码出来。场景是我有一个视图控制器,其中有一个表视图。我的表格视图有三种不同的动态原型,因为我有三种不同类型的单元格。现在,我想做的就是指定在哪一行中生成哪个原型单元。我还在故事板中为每个原型单元指定了唯一的标识符 我的理解方式是,我的cellforRowatIndexpath方法需要了解在该行中显示哪种类型的单元格,然后选择标识符,根据需要退出队列并设置内容 相应地,这是我的代码,我正在尝试: - (UITable

先生们

我需要一些帮助。这几乎就像我知道我想做什么,但我一直无法得到它的工作时,编码出来。场景是我有一个视图控制器,其中有一个表视图。我的表格视图有三种不同的动态原型,因为我有三种不同类型的单元格。现在,我想做的就是指定在哪一行中生成哪个原型单元。我还在故事板中为每个原型单元指定了唯一的标识符

我的理解方式是,我的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项目SABC30068:c07]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSIndexPath setTableViewStyle:]:无法识别的选择器发送到实例0x83812e0”错误

表视图本身没有问题,因为我已经正确设置了数据源和委托。并为表视图制作了一个插座

我还尝试将cellforRowAtIndexPath中的if语句更改为if(myTable.indexPathForSelectedRow==0)。这会在所有单元中生成动态原型,但至少应用程序不会停止

你们认为问题出在哪里

我不知道如何正确使用索引路径,如果有人能帮我,我将不胜感激。

(这是一个有点长的评论,所以我把它放在这里,即使它没有直接回答问题)

异常断点:
转到断点导航器

在导航器的底部有“+”按钮

然后它将添加一个断点供您自定义,只需单击“完成”即可设置。

现在,当抛出异常时,您将被带到触发异常的行。最重要的是,您将能够看到当时的整个调用堆栈。对调试非常有用

从4.2开始,Xcode中的断点可以做很多“时髦”的事情(不确定确切的时间)

(这是一个有点长的评论,所以我把它放在这里,即使它没有直接回答问题)

异常断点:
转到断点导航器

在导航器的底部有“+”按钮

然后它将添加一个断点供您自定义,只需单击“完成”即可设置。

现在,当抛出异常时,您将被带到触发异常的行。最重要的是,您将能够看到当时的整个调用堆栈。对调试非常有用


从4.2开始,Xcode中的断点可以做很多“时髦”的事情(不确定确切的时间)

对于故事板和动态原型单元,您不必担心或检查
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;
}

使用故事板和动态原型单元,您不必担心或检查
dequeueReusableCellWithIdentifier:
是否返回nil单元

你必须做的是:

  • 对于每一行,确定正确的单元格标识符,并将其输入到
    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;
}

你说它在报道:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSIndexPath setTableViewStyle:]:发送到实例0x83812e0的选择器无法识别

cellforrowatinedexpath
未返回有效的
UITableViewCell
时,就会出现这种情况

您从
表视图:numberofrowsinssection:
返回了什么值?我询问的原因是您的
cellForRowAtIndexPath
对于除第一行以外的任何行都将失败。如果您的
表格视图:numberofrowsinssection:
指示的值大于1,则您的应用程序将崩溃

要确认这一点,您可能需要检查
cellforrowatinedexpath
开头的
indepath
是什么,方法的开头添加以下行:

NSLog(@"%s: section = %d; row = %d", __FUNCTION__, indexPath.section, indexPath.row);
这样,您就可以确保要为哪些行生成单元格,并且正确地处理了这些行

后来你说:

我还尝试将cellforRowAtIndexPath中的if语句更改为if(myTable.indexPathForSelectedRow==0)。这会在所有单元中生成动态原型,但至少应用程序不会停止

这显然是行不通的,这意味着对
cellforrowatinexpath
的工作原理感到困惑。它与当前选定的单元格无关。您通过告诉它您可以创建哪些单元格来响应
numberOfSectionsInTableView
tableView:numberofrowsinssection:
,然后iOS将调用
cellforrowatinex