2012-05-12 33 views
1

我想提供一些关于一件事的提示:如何在绑定到tableview的数组中插入“nil”值?

在绑定到tableview列的数组中,我有一些numeric(float)值。使用界面按钮(标记为“0”,“1”,“2”等)输入这些值(放入数组)。还有一个“C”按钮来取消输入。

后来,我对这个数组做了一些计算。如果没有输入任何结果,那么数组的对象不能为0。“无值”当然最好用“nil”表示......但是你不允许在数组中插入一个nil对象(nil表示“数组结尾”)。

NSArray包含对象。也就是说,在这里,这些对象必须是NSNumbers。所以我可以通过填充[NSNumber numberWithDouble:...]来初始化我的数组?我不能把零这里!

一个真正的NSArray没有(不能)包含“洞”。但是,例如,如果第三个项目从来没有收到过价值,我必须这样做。我怎么能:

实现一个“未定义”值为我的NSNumber? 使“C”按钮删除以前输入的结果?

必须有一个解决方案。在ApplescriptObjC我用了一招:我的确在由每个按钮调用该方法的归属,使用它的标题,所以:

if sender's title as string is "C" then 
set item theRow of gResult to missing value -- the row was the selected line, gResult was a AS list. 
else 
set item theRow of gResult to sender's title as real 
end if 

我该怎么办吗? - 选择一个特殊的值(比如-1)来表示未定义的值,然后使用NSPredicate过滤我的数组? - 我怎么能把单元格变成“没有”,因为特殊值是东西,并出现在单元格中(偶数)我确信这个问题有一个很好的解决方案。但现在我只撕了什么小头发,我已经离开了......

感谢帮助...

+0

请格式化代码以提高可读性。有关如何执行此操作,请参阅http://stackoverflow.com/editing-help。 –

回答

3

您可以添加NSNull对象来表示一个空值。

+0

如果我这样做,表格视图在单元格中显示“”。这不是期望的结局。 – berfis

0

你需要在你的NSArray中有一个“高贵的”对象。当你看到这个尊贵的对象时,你的代码会做出不同的事情。这种“杰出”的对象通常被称为“哨兵”,它可以是任何东西。例如:

static NSNumber *theSentinel; 

/* initialize theSentinel somewhere with */ 
theSentinel = [NSNumber numberWithFloat: <anyfloat-doesnt'-matter-which>]; 

然后在你的代码:

NSNumber *selection = [NSArray objectAtIndex: <user selection>]; 

if (selection == theSentinel) { /* something */ } 
else { /* main */ } 

而在你的谓词,您可以使用(在口头上,没有代码):

predicate = (obj NOT EQUAL theSentinel) AND (rest of your predicate based on float) 
+0

我认为使用谓词是最好的解决方案。我可以有一个“屏幕外”数组来完成我的计算。但是我坚持使用谓词的格式。应该像NSArray * myFilteredArray = [[NSArray array] filteredArrayUsingPredicate:nonNullPredicate],但如何定义格式“属性xy!=''”? – berfis

+0

NSPredicate的文档应该是您的参考。提供了两个(不是谓词)和运算符'!='。如何申请将取决于您的设置的详细信息。 – GoZoner

2

一个NSArray必须始终包含对象,nil是表示数组结束的标志。因此,为了表示一个无值的对象,你应该使用NSNull,如下所示:

[NSNull null] 
+0

如果我这样做,表格视图在单元格中显示“”。坏。 – berfis

+0

那么你检查为空,并不显示它的情况。你甚至如何控制你的细胞?不听起来这是非常自定义的 – Daniel

+0

不,它们是简单的文本单元格,绑定到一个arrayController。注意:这些单元格的基本行为是可以的:它们显示的值可以编辑,设置为空字符串以指示“无值”。我的问题是用这些细胞计算。也许是一个“屏幕外”数组,将NSString数组转换为NSNumber数组,从空值中过滤掉? – berfis