【问题标题】:NSMutableSet not adding more than 1 objectNSMutableSet 不添加超过 1 个对象
【发布时间】:2015-04-10 10:56:01
【问题描述】:

我在 for 循环中创建一个标签 (CorePlot) 对象并尝试将其添加到我需要传递一个参数的 NSMutableSet。

奇怪的是,如果添加到 NSMutableSet(第一个)中,则只有一个对象,而其他对象则没有添加。

看起来我缺少一些非常基本的东西。

有什么建议吗?

我附上了代码的屏幕截图,因为我想显示 NSSet 对象持有的值。

图像 1 - 对象被添加到 NSMutableArray 但不是从该数组形成的 NSSet

图 1 中使用的代码 -

    NSArray *months = [NSArray arrayWithObjects:@"Oct",@"Nov",@"Dec",@"Jan",@"Feb",nil];
NSMutableArray *xLabels = [[NSMutableArray alloc] init];
for (NSString *month in months) {
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:month textStyle:axisTextStyle];
    [xLabels addObject:label];
}
NSSet *xLabelSet = [NSSet setWithArray:xLabels];
x.axisLabels = xLabelSet;

图像 2 - 对象未添加到 NSMutableSet

图 2 中使用的代码 -

    NSArray *months = [NSArray arrayWithObjects:@"Oct",@"Nov",@"Dec",@"Jan",@"Feb",nil];
//NSMutableArray *xLabels = [[NSMutableArray alloc] init];
NSMutableSet *xLabelSet = [[NSMutableSet alloc] initWithCapacity:[months count]];
for (NSString *month in months) {
    CPTAxisLabel *label = [[CPTAxisLabel alloc] initWithText:month textStyle:axisTextStyle];
    [xLabelSet addObject:label];
}
//NSSet *xLabelSet = [NSSet setWithArray:xLabels];
x.axisLabels = xLabelSet;

【问题讨论】:

  • 类是否实现了isEqualhash
  • 以后您也可以粘贴这些值。从图像中复制和粘贴代码很困难。
  • 在第一个代码中,您根本没有使用 xLabels。在第二个代码中,您使用 [[NSMutableSet alloc] initWithCapacity:[month count]] 进行初始化,接下来将其分配给 x.axisLabels。
  • @Wain - 是的。签入框架的源文件。这是课程 - core-plot.googlecode.com/hg/documentation/html/iOS/…
  • @LajosArpad - 很抱歉。将发布代码。回答你的问题......在第一个代码中,我在第 195 行将对象添加到 xLabels (NSMutableArray),并尝试在第 197 行从 xLabels 创建 NSSet (xLabelSet)。在第二个代码中,我在第 196 行将对象添加到 xLabelSet。

标签: ios core-plot nsmutableset


【解决方案1】:

CPTAxisLabel 的 isEqual 方法的文档说 -

如果坐标轴标签具有相同的刻度位置,则它们是相等的。

由于您没有为要添加的标签指定 tickLocation 属性,它们都将具有相同的 tickLocation - 0。

由于isEqual 为您的所有标签返回true,您最终只会得到NSSet 中的第一个标签 - 后续标签的添加将被跳过,因为集合中已经存在相等的对象。

【讨论】:

  • 好吧……有道理……谢谢……很长一段时间以来我一直对此感到头疼:)
  • 有没有其他方法可以在同一刻度位置显示标签?
【解决方案2】:

我没有在您的代码中看到错误,但我建议使用CFMutableSetRef,因为它具有免费桥接功能。使用它将使您能够将其作为您需要的参数。

也许使用来自CFMutableSetRef 的消息(方法)将使您能够添加更多对象。

我想尝试的另一件事是简单地用CPTAxisLabels 做一个数组,并使用NSMutableSet 中的addObjectsFromArray 方法并检查它是否有效。

【讨论】:

  • 谢谢@Joze ...你能给 CFMuableSetRef 一些示例代码吗?我尝试使用它,但没有初始化方法。尝试使用 CFMutableSet 进行初始化,但它说 ARC 中不允许隐式转换。也已经尝试过 addObjectsFromArray 但它不起作用。
  • @Dev 我认为你必须使用CFDataCreateMutable 来初始化它。喜欢CFDataCreateMutable(NULL,0)。我现在认为 Paulw11 的答案可能更重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多