因此,项目组成员和我一直在分别处理我们的部件。我一直在处理应用程序中的一半视图,他已经在另一半工作。我把他的一半送到了他的一半,但当他试图打开我的一半并运行它时,我们得到了不一致的结果。我们还没有合并它们,所以它们不应该采取不同的行动。我试图在其他几台计算机上测试它们,它们都给出了相同的结果(与我的不同)。
以下代码应该打印“CHECKED X”。 X表示在该点滴答的单元格数。在我的计算机上,它打印“CHECKED 1..2..3..4”,您最多只能选择4,具体取决于勾选的数量。在任何其他计算机上,它打印“CHECKED 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]);
}
}
}
}
在我看来,我的数据容器单例中的收藏夹数组没有被填充。饮料阵列不是空的。
以下是DataContainerSingleton类的代码:
DataContainerSingleton.h
#import <Foundation/Foundation.h>
@interface DataContainerSingleton : NSObject
{
NSMutableArray *favourites;
NSMutableArray *drinks;
NSString *name;
int caffeine;
@private
}
@property (nonatomic, retain) NSMutableArray *favourites;
@property (nonatomic, retain) NSMutableArray *drinks;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) int caffeine;
+ (DataContainerSingleton *) theDataContainerSingleton;
@end
DataContainerSingleton.m
#import "DataContainerSingleton.h"
@implementation DataContainerSingleton
@synthesize favourites, drinks;
@synthesize name, caffeine;
static DataContainerSingleton* _theDataContainerSingleton = nil;
+ (DataContainerSingleton*) theDataContainerSingleton;
{
if (!_theDataContainerSingleton)
_theDataContainerSingleton = [[DataContainerSingleton alloc] init];
return _theDataContainerSingleton;
}
- (id)init
{
self = [super init];
if (self)
{
self.favourites = [[[NSMutableArray alloc] init] autorelease];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
@end
我检查了程序中的所有依赖项,它们都不在我复制的文件夹之外。我已经清理并清理了构建文件夹,但它仍然打印0。
有人知道可能导致这种不一致的原因吗?提前谢谢。
答案 0 :(得分:3)
我把他的一半送给他,以结合他的一半
开始使用版本控制软件。你正在为自己制造不必要的事情。起初有一个小的学习曲线,但即使你的第一个非平凡的项目也会得到回报。
如果您确定您拥有相同的代码库副本,那么您可以将其缩小为以下之一:
不同的工具链。确保您使用相同版本的所有SDK等运行相同版本的Xcode。
不同的数据。从您的设备中删除该应用,然后重试。
在捆绑包中存档文件。通过Xcode安装开发版本不会从捆绑包中删除旧文件。你的包中可能有他没有的文件,反之亦然。从您的设备中删除该应用,然后重试。
不同的硬件。偶尔错误只会出现在某些硬件上。不同的设备功能可以在不同的路径上发送相同的代码。你们两个都试着暂时在模拟器中进行测试。
答案 1 :(得分:0)
我认为您提到的“不一致结果”可能是因为您可能已在Interface Builder中为delegate
的{{1}}和dataSource
建立了连接tableView
,但您的朋友有DataContainerSingleton
的不同版本,其中不存在该连接。这不会给出任何编译错误或警告,但会将其自身表示为“错误”,其中没有实际调用任何委托或数据源方法。既然您可以看到日志记录语句,我会假设.xib
设置正确,但delegate
不是..?
另一个选项是您的dataSource
方法每次都返回一个新单元格(没有复选标记,因此您只能检查但永远不会取消选中)。
编辑:为了更准确地说明这一点,你应该在cellForRowAtIndexPath
中有这些代码:
cellForRowAtIndexPath
否则,如果iPhone的内存不足,操作系统会要求应用程序从内存中清除任何非必需的对象,其中包括现有的单元格。因此,下次您在第2行检索单元格时,它必须创建一个具有默认值的新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;
}
对象,这意味着UITableViewCell
的附件。因此,每次获取单元格时都应明确设置复选标记。
看到你的第一条评论后:好的。您应确保不添加重复的None
。如果选择了某行,请确保indexPath
不包含您要添加的路径。