首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMutableArray难度

NSMutableArray难度
EN

Stack Overflow用户
提问于 2012-06-26 03:56:02
回答 5查看 889关注 0票数 2

如果您想查看我有问题的代码,下面是链接:代码

我的问题与我的过去的问题有关。

我的NSMutableArray确实有问题,我目前正在为我的slotMachine对象(slot1和slot2)使用iCarousel。我的应用程序是这样工作的:

PhotoViewController中,我创建了一个有缩略图的视图,然后用按钮指定它的框架。因此,如果按下1个图像,它将通过NSUserDefaults保存该整数。然后我将在我的carouselViewController中检索它

我正在考虑调整数组,但我做不到。我也在这里尝试过我的问题:如果我能像与NSMutableArray的比较那样做,它会很容易,但仍然不起作用。

(附加信息:)

我是这样做的,有一个包含UIImageView的视图控制器,其中有一个按钮,所以当用户点击它时,我的CustomPicker就会弹出。我的CustomPicker包含了用户在相机卷上选择的图像。因此,每个按钮都有一个使用NSUserDefaults发送给我的NSUserDefaults的特定值。carousel1用于第一个时隙,carousel2用于第二个时隙。

下面是我想要做的事情:我想强行让它停止使用用户选择的索引。(这是我在carouselDidEndScrollingAnimtaion上做的)

在我的carouselDidEndScrollingAnimation方法中,我测试了我的所有条件(单独的),它在比较方面非常完美。然后,当我结合这些条件时,前两个比较或停止是正确的,但是后面的两个总是错误的。或者有时候搞混了。

我需要滚动两个特定的索引/整数,这是用户选择的(我已经这样做了)能够滚动2对索引,但是接下来的两个总是错误的,因为我认为有索引正在调整。

图片:

下面的图片是我的PhotoViewController,它包含了我的游戏的比较阶段SETTINGUIImageVIewUIButton.Image将根据这个数字被强制显示,并且应该被强制显示。

当我的iCarousel启动时,它会停止,例如在下面的图像中(这与上面的不同):

将强制滚动到PhotoViewController中输入的图像。

转入:

摘要:是这样的。我在那里有一个settingsView,我将导入Slot1 & Slot2的图像(多个)。然后,在另一个视图中,显示上面图像的PhotoViewController。THe第一列对应于第一时隙,其次是第二时隙。如果按下一个视图(例如,No. 1 of Slot 1 ),它将加载从Picker中为Slot 1选择的图像的缩略图。

您必须执行4次(对)-->这里显示的内容,我通过NSUserDefaults通过button.tag获取他们的索引,然后发送到iCarouselView

然后,当您完成(按下Done按钮)时,它将转到iCarouselView,如上面所示,这就是它的视图。当按下它时,它会旋转几秒钟,当它完成而不是停留在PhotoView中选择的用户时,它将有力地滚动到该索引。

问题:

是否有办法使我的数组或我的iCarousel.view在我删除时不调整它们的索引。以正确的方式保留我的索引。或者还有其他解决方案,比如调整我的数组,就像调整我的PhotoViewController选择的索引一样。因为我认为,当数组保留它们的索引,甚至删除它们时,我就能够解决这个问题。但还是不能。

希望你能理解我的问题。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-12 20:30:15

是否有办法使我的数组或我的iCarousel.view在我删除时不调整它们的索引。以正确的方式保留我的索引。或者还有其他解决方案,比如调整我的数组,就像调整我的PhotoViewController选择的索引一样。因为我认为,当数组保留它们的索引,甚至删除它们时,我就能够解决这个问题。但还是不能。

修改iCarousel管理索引的方式的唯一方法是修改代码。实际上,如果您查看iCarousel.m中的removeViewAtIndex方法,您将看到索引是通过一个NSDictionary管理的,并且在删除时,字典将被重新排列(条目被重新排序)。你可以采取这样的方法:

代码语言:javascript
复制
- (void)removeViewAtIndex:(NSInteger)index
{
    NSMutableDictionary *newItemViews = [NSMutableDictionary dictionaryWithCapacity:[itemViews count] - 1];
    for (NSNumber *number in [self indexesForVisibleItems])
    {
        NSInteger i = [number integerValue];
        if (i < index)
        {
            [newItemViews setObject:[itemViews objectForKey:number] forKey:number];
        }
        else if (i > index)
        {
            [newItemViews setObject:[itemViews objectForKey:number] forKey:[NSNumber numberWithInteger:i - 1]];
        }
    }
    self.itemViews = newItemViews;
}

您可以对数组应用相同的逻辑,以便旋转木马和数组保持同步。当然,如果您将索引存储在某个地方(slot1/slot2/slot2/slot4?),您也应该在删除元素后更新它们的值。

另一方面,我认为你在这里要求的是如何做一些你认为能解决问题的事情,但你并没有真正解释问题的所在。事实上,如果我对你的理解正确,你所做的就是:

  1. 旋转旋转木马;
  2. 当旋转木马停止时,如果它不是偶然出现在所需的项目上,您将“强制”它滚动到该项目。

在删除某些元素之后,这没有理由不起作用(除非iCarousel有一些bug,否则解决方案就是捕获bug)。唯一的部分是知道哪个索引是您想要移动的。

作为建议,我将首先简化您的委托carouselDidEndScrollingAnimation方法。实际上,您的carouselDidEndScrollingAnimation有一个名为carousel的参数,我认为这是该方法中唯一应该引用的旋转木马。如果您没有看到它,这就是原因:每个旋转木马都将停止滚动,carouselDidEndScrollingAnimation将被调用;因此该方法将被调用两次。每次执行该方法时,您都将修改carousel1和carousel2的状态(通过调用scrollToItemAtIndex);因此,在每个旋转木马上,您将调用scrollToItemAtIndex两次。

对我来说这听起来不太正确。因此,您应该找到一种方法,在调用carousel1时只滚动carouselDidEndScrollingAnimation,而在调用carousel2时只滚动carousel2。

更广泛地说,我想提出的另一点是:

  1. 让旋转木马停下来;
  2. 再次滚动,使其达到所需的位置;

似乎不是最好的实现,因为用户会看到旋转木马停止,然后重新开始。

我处理这个问题的方法是直接修改iCarousel实现,以便它支持您需要的特定行为。

具体来说,看看iCarousel.m中的step方法。这将在每个帧中调用,以生成旋转木马动画。现在,在这个方法中有一个decelerating分支:

代码语言:javascript
复制
else if (decelerating)
{
    CGFloat time = fminf(scrollDuration, currentTime - startTime);
    CGFloat acceleration = -startVelocity/scrollDuration;
    CGFloat distance = startVelocity * time + 0.5f * acceleration * powf(time, 2.0f);
    scrollOffset = startOffset + distance;

    [self didScroll];
    if (time == (CGFloat)scrollDuration)
    {
        decelerating = NO;
        if ([delegate respondsToSelector:@selector(carouselDidEndDecelerating:)])
        {
            [delegate carouselDidEndDecelerating:self];
        }
        if (scrollToItemBoundary || (scrollOffset - [self clampedOffset:scrollOffset]) != 0.0f)
        {
            if (fabsf(scrollOffset/itemWidth - self.currentItemIndex) < 0.01f)
            {
                //call scroll to trigger events for legacy support reasons
                //even though technically we don't need to scroll at all
                [self scrollToItemAtIndex:self.currentItemIndex duration:0.01];
            }
            else
            {
                [self scrollToItemAtIndex:self.currentItemIndex animated:YES];
            }
        }
        else
        {
            CGFloat difference = (CGFloat)self.currentItemIndex - scrollOffset/itemWidth;
            if (difference > 0.5)
            {
                difference = difference - 1.0f;
            }
            else if (difference < -0.5)
            {
                difference = 1.0 + difference;
            }
            toggleTime = currentTime - MAX_TOGGLE_DURATION * fabsf(difference);
            toggle = fmaxf(-1.0f, fminf(1.0f, -difference));
        }
    }
}

当旋转木马停止减速时,它会再次滚动。这与您所做的完全相同,因此您可能会找到一种方法来修改这段代码,并将旋转木马滚动到所需的索引。这样你就可以更顺利地旋转旋转木马了。

希望这有助于并为冗长的答复道歉。

票数 1
EN

Stack Overflow用户

发布于 2012-07-09 17:02:33

要知道这是什么问题有点困难。您是否对图像使用单个NSMutableArray,并使用NSUserDefaults值在数组中的索引处获取对象?

我不能百分之百地肯定正在发生的事情。用户做什么(以及在哪个视图中)以及在该视图之后触发什么(显示哪个视图)。

您是否试图停止图像上的“旋转”图像,该图像与从上一视图中选择的图像相同?

根据上面的图片,图像是由一个单一的索引关闭的。每次都是这样吗?也许从数组中获取有问题。

如果你能给我更多的信息我能帮上忙。

我看了一下你粘贴的代码,我想这可能是你的问题。

代码语言:javascript
复制
if (twoSlot1 > [(UIImageView*)[self.carousel2 currentItemView] tag]){            
                [self.carousel1 scrollToItemAtIndex:(-twoSlot1)-2 duration: 3.5f];
            } else {
                [self.carousel1 scrollToItemAtIndex:-twoSlot1 duration: 3.5f];
            }

在所有类似的代码块上,都有这样的代码块,您可以在其中调用每个旋转木马。在上面的代码中,您可以两次调用旋转木马1。

代码语言:javascript
复制
if (slot2 > [(UIImageView*)[self.carousel1 currentItemView] tag]){
            [self.carousel1 scrollToItemAtIndex:(-slot2)-2 duration: 3.0f];
            } else {
            [self.carousel1 scrollToItemAtIndex:-slot2 duration: 3.0f];    
            }

            if (twoSlot2 > [(UIImageView*)[self.carousel2 currentItemView] tag]){
            [self.carousel2 scrollToItemAtIndex:(-twoSlot2)-2 duration: 3.5f];    
            } else {
            [self.carousel2 scrollToItemAtIndex:-twoSlot2 duration: 3.5f];
            }

当你应该拨打2号的时候,你就打给self.carousel1。

这是正确的吗?

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 08:40:37

提到你的问题。您需要一个在从数组中删除成员时不更改其成员索引的数组。

我想你可以用NSMutableDictionary。它是一个关联数组,也就是说,索引是由您选择的,当您从中间删除一个成员时,索引保持不变。您仍然可以使用0.n作为索引。您仍然可以使用NSArray中熟悉的一些方法,例如count。您可以使用枚举数来遍历字典的所有成员。另一方面,您仍然可以使用for-循环,因为您习惯于将它们与数组一起使用。只要做好准备,a) objectForKey:如果键/索引不存在(例如,已被删除),并且计数保留对象的数量,但不像数组那样返回最高的index+1,那么我可能返回零。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11200584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档