Iphone XCode在多台计算机上的结果不一致

Iphone XCode在多台计算机上的结果不一致,iphone,objective-c,ios,xcode,cocoa-touch,Iphone,Objective C,Ios,Xcode,Cocoa Touch,因此,我和一个项目组成员一直在分别处理我们的部分。我一直在处理应用程序中的一半视图,而他在处理另一半视图。我送他我的那一半去和他的那一半合并,但当他试图打开我的那一半并运行它时,我们得到了不一致的结果。我们还没有将它们结合起来,所以它们的行为不应该有所不同。我试着在其他几台计算机上测试,结果都一样(和我的不同) 下面的代码应该打印“选中的X”。X表示在该点勾选的单元格数。在我的电脑上,它会打印“CHECKED 1..2..3..4”,根据勾选的数量,最多只能选择4个。在任何其他计算机上,它都会打

因此,我和一个项目组成员一直在分别处理我们的部分。我一直在处理应用程序中的一半视图,而他在处理另一半视图。我送他我的那一半去和他的那一半合并,但当他试图打开我的那一半并运行它时,我们得到了不一致的结果。我们还没有将它们结合起来,所以它们的行为不应该有所不同。我试着在其他几台计算机上测试,结果都一样(和我的不同)

下面的代码应该打印“选中的X”。X表示在该点勾选的单元格数。在我的电脑上,它会打印“CHECKED 1..2..3..4”,根据勾选的数量,最多只能选择4个。在任何其他计算机上,它都会打印“已勾选0”,您可以随意勾选(但不能取消勾选)。勾选它们的代码如下:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        if ((cell.accessoryType == UITableViewCellAccessoryNone) && [[DataContainerSingleton theDataContainerSingleton].favourites count] < 4 && ![self.tickedIndexPaths containsObject:indexPath])
        {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                [self.tickedIndexPaths addObject:indexPath];

                [[DataContainerSingleton theDataContainerSingleton].favourites addObject:[drinks objectAtIndex:indexPath.row]]; // DOES NOT ADD AN OBJECT?
                NSLog(@"CHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
        }
        else if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
        {
            [self.tickedIndexPaths removeObject:indexPath];
            for (int i = 0; i < [[DataContainerSingleton theDataContainerSingleton].favourites count]; i++)
            {
                NSString *drinkName = [[drinks objectAtIndex:indexPath.row] name];
                NSString *favName = [[[DataContainerSingleton theDataContainerSingleton].favourites objectAtIndex:i] name];

                if ([drinkName isEqualToString: favName])
                {
                    cell.accessoryType = UITableViewCellAccessoryNone;
                    [[DataContainerSingleton theDataContainerSingleton].favourites removeObjectAtIndex:i];
                    NSLog(@"UNCHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
                }
            }

        }

}
我已经检查了程序中的所有依赖项,它们都不在我复制的文件夹之外。我已清理并清理了生成文件夹,但它仍打印0

有人知道是什么导致了这种不一致吗?提前感谢。

我认为您提到的“不一致的结果”可能是因为您可能已在Interface Builder中为
代理
表视图的
数据源
DataContainerSingleton
建立了连接,但是您的朋友有一个不同版本的
.xib
,其中不存在该连接。这不会给出任何编译错误或警告,但会以“bug”的形式出现,其中没有实际调用任何委托或数据源方法。由于您可以看到日志语句,我假定
委托
设置正确,但
数据源
不正确

另一个选项是,
cellforrowatinexpath
方法每次都返回一个新的单元格(没有复选标记,因此只能选中,不能取消选中)

编辑:为了更准确地说明这一点,您应该在
cellforrowatinexpath
中使用以下代码:

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:@"drinkCell"];
if(cell == nil) // we need to create a new one
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:@"drinkCell"];
}

if([tickedIndexPaths containsObject:indexPath])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}
否则,如果iPhone内存不足,操作系统将要求应用程序从内存中清除任何不必要的对象,包括现有的单元格。因此,下一次检索第2行的单元格时,例如,它必须使用默认值创建一个新的
UITableViewCell
对象,这意味着
None
的附件。因此,每次获取单元格时都应该显式设置复选标记

看到你的第一句评论后:好的。您应该确保不添加重复的
indepath
。如果选择了一行,请确保
checkedIndexPaths
不包含要添加的路径。

我认为“结果不一致”您提到这一点可能是因为您可能在Interface Builder中为
表视图的
委托
数据源
DataContainerSingleton
建立了连接,但您的朋友有一个不同版本的
.xib
,其中不存在该连接。这不会给出任何编译错误或警告,但会以“bug”的形式出现,其中没有实际调用任何委托或数据源方法。由于您可以看到日志语句,我假定
委托
设置正确,但
数据源
不正确

另一个选项是,
cellforrowatinexpath
方法每次都返回一个新的单元格(没有复选标记,因此只能选中,不能取消选中)

编辑:为了更准确地说明这一点,您应该在
cellforrowatinexpath
中使用以下代码:

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:@"drinkCell"];
if(cell == nil) // we need to create a new one
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:@"drinkCell"];
}

if([tickedIndexPaths containsObject:indexPath])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}
否则,如果iPhone内存不足,操作系统将要求应用程序从内存中清除任何不必要的对象,包括现有的单元格。因此,下一次检索第2行的单元格时,例如,它必须使用默认值创建一个新的
UITableViewCell
对象,这意味着
None
的附件。因此,每次获取单元格时都应该显式设置复选标记

看到你的第一句评论后:好的。您应该确保不添加重复的
indepath
。如果选择了一行,请确保
checkedIndexPaths
不包含要添加的路径

我把我的那一半送给他,让他和我的那一半结合起来

开始使用版本控制软件。你在给自己制造不必要的困难。一开始有一个很小的学习曲线,但即使在你的第一个非琐碎的项目上,它也会有回报

如果您确信您拥有相同的代码库副本,那么您可以将其缩小到以下范围之一:

  • 不同的工具链。确保你们都在用相同版本的SDK等运行相同版本的Xcode

  • 不同的数据。请从设备中删除该应用,然后重试

  • 捆绑包中的延迟文件。通过Xcode安装开发版本不会从捆绑包中删除旧文件。您的包中可能有他没有的文件,反之亦然。请从设备中删除该应用,然后重试

  • 不同的硬件。偶尔,bug只在某些硬件上出现。不同的设备功能可以通过不同的路径发送相同的代码。你们两个都试着暂时在模拟器中测试

我把我的那一半送给他,让他和我的那一半结合起来

开始使用版本控制软件。你在给自己制造不必要的困难。一开始有一个很小的学习曲线,但即使在你的第一个非琐碎的项目上,它也会有回报

如果您确信您拥有相同的代码库副本,那么您可以将其缩小到以下范围之一:

  • 不同的
    UITableViewCell *cell;
    cell = [tableView dequeueReusableCellWithIdentifier:@"drinkCell"];
    if(cell == nil) // we need to create a new one
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:@"drinkCell"];
    }
    
    if([tickedIndexPaths containsObject:indexPath])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }