2 Stimmen

NSMutableArray Schwierigkeitsgrad

Wenn Sie den Code sehen wollen, mit dem ich Probleme habe, hier ist der Link: Code

Meine Frage steht im Zusammenhang mit meiner letzte Frage .

Ich habe wirklich Probleme mit meinem NSMutableArray verwende ich derzeit iCarousel für meine slotMachine Objekt(slot1 und slot2). Meine App funktioniert folgendermaßen:

En PhotoViewController Ich habe eine Ansicht mit Miniaturbildern erstellt und ihr dann einen Rahmen mit einer Schaltfläche zugewiesen. Also, wenn 1 Bild gedrückt wurde, wird es diese ganze Zahl über speichern NSUserDefaults . Dann werde ich sie in meinem carouselViewController

Ich denke daran, die Anordnung anzupassen, aber ich kann es nicht. Ich habe auch versucht, meine Frage hier: Vergleich mit NSMutableArray Wenn ich es nur genauso machen könnte wie die Array 2 wäre es viel einfacher, aber es funktioniert immer noch nicht.

( ZUSATZINFO :)

Ich habe es auf diese Weise getan, haben einen Viewcontroller, der die UIImageView mit einer Schaltfläche in es enthält, so dass, wenn der Benutzer tippt es, meine CustomPicker auftaucht. Meine CustomPicker enthält das Bild, das der Benutzer auf der Kamerarolle ausgewählt hat. Jede Schaltfläche hat also einen bestimmten Wert, der an meine iCarouselView mit NSUserDefaults . Karussell1 für den ersten Steckplatz und Karussell2 für den zweiten Steckplatz.

Ich möchte Folgendes tun: Ich möchte zwangsweise auf den Index der Benutzer wählt zu stoppen. (Die Im tun in meinem carouselDidEndScrollingAnimtaion )

In meinem carouselDidEndScrollingAnimation Methode, mit der ich alle meine Bedingungen (einzeln) getestet habe, funktioniert perfekt in Bezug auf den Vergleich. Dann, wenn ich die Bedingungen zu kombinieren, die ersten zwei Vergleich oder STOP ist RICHTIG, aber die nächsten zwei sind immer falsch. Oder manchmal durcheinander.

Ich brauche, um die beiden spezifischen Indizes / Integer, die User Picked war (ich habe bereits getan, dass) war in der Lage, 2 Paare von ihnen zu blättern, aber dann die nächsten zwei waren immer falsch, weil ich denke, es Indizes angepasst wurden.

BILDER:

Das Bild unten ist mein PhotoViewController die die Stufe "Vergleichen" enthielt SETTING meines Spiels. UIImageVIew con UIButton Bild, das in der Nummer entsprechend gesetzt wird, wird zwangsweise und sollte zwangsweise gezeigt werden.

enter image description here

Wenn mein iCarousel Start dann stoppt es zum Beispiel in das Bild unten (Das ist nicht das gleiche wie das oben): enter image description here

Es wird zwangsweise zum eingegebenen Bild in der PhotoViewController

In: enter image description here

Zusammenfassung: Es ist folgendermaßen. Ich habe eine settingsView von dort aus importiere ich meine Bilder (mehrere) für Slot1 & Slot2 . Dann wird in einer anderen Ansicht die PhotoViewController dort ist das obige Bild zu sehen. Die erste Spalte entspricht dem ersten Steckplatz, gefolgt vom zweiten Steckplatz. No. 1 de Slot 1 wird eine Miniaturansicht der Bilder geladen, die die Bilder aus Picker für die Slot 1 .

Sie müssen es 4 mal machen (Paar) ----> Die hier angezeigten Indizes erhalte ich über NSUserDefaults via button.tag und sende sie an iCarouselView .

Wenn Sie dann fertig sind (gedrückt Done Taste) geht es zu iCarouselView dann, wie oben gezeigt, das ist die Ansicht davon. Wenn man sie drückt, dreht sie sich für ein paar Sekunden, wenn sie fertig ist, hält sie aber nicht an der Stelle an, die der Benutzer im Feld PhotoView wird zwangsweise zu diesem Index geblättert.

QUESTION:

Gibt es eine Möglichkeit, mein Array oder meine iCarousel.view nicht ihre Indizes anpassen, wenn Im löschen. Um noch meine Indizes den richtigen Weg zu behalten. Oder gibt es andere Lösung wie die Anpassung meiner Array, das gleiche wie die Anpassung meiner PhotoViewController auch Indizes ausgewählt. Weil ich denke, dass, wenn meine Array behalten ihre Indizes auch Löschen ich in der Lage wäre, dieses Problem zu lösen. Aber noch kann nicht.

Ich hoffe, Sie verstehen meine Frage.

1voto

some_id Punkte 28886

Es ist ein bisschen schwierig zu wissen, was hier das Problem ist. Verwenden Sie ein einzelnes NSMutableArray für die Bilder und verwenden Sie den Wert NSUserDefaults, um das Objekt am Index im Array zu erhalten?

Ich bin mir nicht zu 100 % sicher, was hier passiert. Was tut der Benutzer (und in welcher Ansicht) und was danach ausgelöst wird (welche Ansicht angezeigt wird).

Versuchen Sie, die "drehenden" Bilder auf dem Bild zu stoppen, das mit dem aus der vorherigen Ansicht ausgewählten Bild identisch ist?

Nach Ihren obigen Bildern sind die Bilder um einen einzigen Index versetzt. Ist das jedes Mal der Fall? Vielleicht gibt es ein Problem mit Ihrem Abrufen aus dem Array.

Wenn Sie mir mehr Informationen geben, kann ich Ihnen helfen.

Ich habe mir den Code, den Sie eingefügt haben, noch einmal angesehen, und ich glaube, das könnte Ihr Problem sein

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

Bei allen anderen Codeblöcken dieser Art haben Sie dies, wo Sie jedes Karussell aufrufen. In dem obigen Code rufen Sie Karussell 1 zweimal auf.

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];
            }

Sie rufen self.carousel1 auf, obwohl Sie eigentlich Nummer 2 aufrufen sollten.

Ist dies richtig?

1voto

sergio Punkte 68479

Gibt es eine Möglichkeit, mein Array oder meine iCarousel.view nicht ihre Indizes anpassen, wenn Im Löschen. Um noch meine Indizes der richtige Weg zu behalten. Oder gibt es andere Lösung wie die Anpassung meiner Array, das gleiche wie die Anpassung meiner PhotoViewController Indizes ausgewählt zu. Denn ich denke, dass, wenn mein Array behalten ihre Indizes auch Löschen ich in der Lage wäre, dieses Problem zu lösen. Aber noch kann nicht.

Die einzige Möglichkeit, die Art und Weise, wie iCarousel seine Indizes verwaltet, zu ändern, besteht darin, den Code zu modifizieren. In der Tat, wenn Sie sich die removeViewAtIndex Methode in iCarousel.m sehen Sie, dass die Indizes über ein NSDictionary verwaltet werden und dass beim Löschen das Dictionary neu geordnet wird (die Elemente werden neu geordnet). Sie könnten diese Methode übernehmen:

- (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;
}

Sie können die gleiche Logik auf Ihr Array anwenden, so dass das Karussell und Ihr Array synchron bleiben. Natürlich, wenn Sie die Indizes irgendwo speichern (slot1/slot2/slot2/slot4?), sollten Sie auch ihre Werte nach dem Entfernen eines Elements aktualisieren.

Andererseits glaube ich, dass Sie hier fragen, wie man etwas tun kann, von dem Sie glauben, dass es das Problem lösen würde, das Sie haben, aber Sie erklären nicht wirklich, was das Problem ist. Wenn ich Sie richtig verstehe, ist das, was Sie tun, in der Tat:

  1. das Karussell zu drehen;

  2. Wenn das Karussell anhält und sich nicht zufällig auf dem gewünschten Element befindet, "zwingen" Sie es, zu diesem Element zu blättern.

Es gibt keinen Grund, warum dies nach dem Löschen einiger Elemente nicht funktionieren sollte (es sei denn, iCarousel hat einige Bugs, dann wäre die Lösung, den Bug zu fangen). Der einzige Teil ist zu wissen, welcher Index derjenige ist, zu dem Sie wechseln möchten.

Als Vorschlag würde ich mit der Vereinfachung Ihrer Delegierten beginnen carouselDidEndScrollingAnimation Methode. In der Tat, Ihr carouselDidEndScrollingAnimation hat einen Parameter namens carousel Nun, ich denke, dies ist das einzige Karussell, auf das Sie sich bei dieser Methode beziehen sollten. Wenn Sie es nicht sehen, ist dies der Grund: jedes Ihrer Karussell wird aufhören zu scrollen und die carouselDidEndScrollingAnimation aufgerufen wird; diese Methode wird also zweimal aufgerufen. Jedes Mal, wenn diese Methode ausgeführt wird, ändern Sie den Zustand von Karussell1 und Karussell2 (durch den Aufruf von scrollToItemAtIndex ); daher werden Sie bei jedem Karussell scrollToItemAtIndex zweimal.

Das klingt für mich nicht sehr korrekt. Sie sollten also einen Weg finden, nur Karussell1 zu scrollen, wenn carouselDidEndScrollingAnimation für Karussell1 aufgerufen wird und nur Karussell2 blättert, wenn carouselDidEndScrollingAnimation wird für Karussell2 aufgerufen.

Ein weiterer Punkt, den ich ansprechen möchte, ist, dass die Idee von:

  1. ein Karussell anhalten zu lassen;

  2. und blättern Sie erneut, bis Sie die gewünschte Position erreicht haben;

scheint nicht die bestmögliche Umsetzung zu sein, da der Benutzer sehen würde, dass das Karussell anhält und dann wieder von vorne beginnt.

Ich würde dies angehen, indem ich direkt die iCarousel-Implementierung so modifiziere, dass sie das von Ihnen benötigte spezifische Verhalten unterstützt.

Konkret, schauen Sie sich die step Methode in iCarousel.m. Diese wird bei jedem Bild aufgerufen, um die Karussellanimation zu erzeugen. In dieser Methode gibt es eine decelerating Zweigstelle:

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));
        }
    }
}

und Sie sehen, dass das Karussell, wenn es aufhört zu verlangsamen, wieder gescrollt wird. Das ist genau das Gleiche, was Sie tun. Sie könnten also einen Weg finden, diesen Code zu ändern und das Karussell genau an den von Ihnen benötigten Index zu verschieben. Auf diese Weise würde sich das Karussell viel sanfter drehen.

Ich hoffe, das hilft und entschuldige mich für die lange Antwort.

1voto

Hermann Klecker Punkte 13881

Bezugnehmend auf Ihre Frage. Sie wollen ein Array, das die Indizes seiner Mitglieder nicht ändert, wenn ein Mitglied aus dem Array gelöscht wird.

Ich denke, Sie könnten ein NSMutableDictionary verwenden. Dabei handelt es sich sozusagen um ein assoziatives Array, bei dem die Indizes frei wählbar sind und unverändert bleiben, wenn Sie ein Element dazwischen löschen. Sie können immer noch 0..n als Ihren Index verwenden. Sie können weiterhin einige Methoden verwenden, die Sie von NSArray kennen, wie z.B. count. Sie können einen Enumerator verwenden, um alle Mitglieder des Wörterbuchs zu durchlaufen. Auf der anderen Seite können Sie weiterhin Ihre for-Schleifen verwenden, wie Sie sie von Arrays gewohnt sind. Seien Sie nur darauf vorbereitet, dass a) objectForKey:i möglicherweise null zurückgibt, wenn der Schlüssel/Index nicht existiert (z. B. gelöscht wurde), und dass count die Anzahl der Objekte zurückgibt, aber nicht den höchsten Index+1, wie es bei Arrays der Fall ist.

0voto

Ethan Holshouser Punkte 1392

Es fällt mir schwer, Ihr Gesamtproblem zu verstehen, aber nach dem, was ich verstehe, ist der Kern Ihrer Frage folgender:

Gibt es eine Möglichkeit, mein Array oder meine iCarousel.view nicht ihre Indizes anpassen, wenn Im löschen.

Ich weiß nicht, ob es Ihr größeres Problem lösen wird, aber mit einem NSMutableDictionary ein Array zu simulieren sollte es Ihnen ermöglichen, dies zu tun. Sie können einfach die Indizes als Schlüssel für das Wörterbuch verwenden, und wenn Sie dann das mit einem Index verbundene Element entfernen, werden keine anderen Indizes als Ergebnis angepasst. Zum Beispiel:

NSMutableDictionary *arrayDict = [[NSMutableDictionary alloc] init];
[arrayDict setValue:foo forKey:[NSNumber numberWithInt:[arrayDict count]]];
[arrayDict setValue:bar forKey:[NSNumber numberWithInt:[arrayDict count]]];
[arrayDict setValue:fooBar forKey:[NSNumber numberWithInt:[arrayDict count]]];

Und dann können Sie auf das Objekt an at index mit [arrayDict objectForKey:[NSNumber numberWithInt:index]] .

Beachten Sie, dass die Verwendung einer NSNumber für den Schlüsselparameter von setValue:forKey: eine Warnung auslöst, die Sie aber getrost ignorieren können (oder verwenden Sie die String-Darstellung, wenn Sie das stört).

0voto

Maxwell Bohling Punkte 146

Ich bin mir nicht sicher, ob ich das richtig verstehe, aber wenn eines der Elemente in Ihrem veränderbaren Array gelöscht wird, sollten Sie es vielleicht mit einem anderen "Dummy"-Platzhalterobjekt einfügen, anstatt es einfach zu löschen. Auf diese Weise ändern sich Ihre Indizes beim Löschen überhaupt nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X