[英]Objective-C Index Array
我正在基於火種的刷卡功能構建一個(玩笑)應用程序,使我能夠保持“魔術聚會”游戲的得分。
過去,我只是通過將數字作為字符串遞增和遞減來完成此操作。 這很好。
現在,我使用Richard Kim的TinderSimpleSwipeCards ,它從帶有整數的數組中加載卡片。 刷卡時,有一種方法稱為在陣列中加載下一個數字。 作為Objective-C的新手,我花了一個小時嘗試根據我的需要重新調整陣列的用途。 但是我被困住了。
由於玩家可以在“魔法聚會”中獲得或失去生命,因此我的目標是能夠首先加載20,然后向右輕掃以增加數字,向左輕掃以減少數字(降低為0)。
我的第一個想法是創建一個包含40個數字的數組,然后使該方法從索引20開始,從而將整數20加載到卡中。然后,通過向任一方向調用該方法,可以將卡加載為正數或負面的方向。
但這沒有用。
這是Richard的DraggableViewBackground.m文件。 他在-(void)loadCards中調用該方法,這是我一直在嘗試處理索引號的地方。
我相當肯定這不能通過使用數組來完成,方法是簡單地從中間的索引開始,然后在(i-1)或(i + 1)方向上運行For循環。 當我確實在特定索引號處調用對象時,該方法將繼續在該索引處創建卡(例如,如果我創建了DragDraggableViewWithDataAtIndex:4,則新卡為16-數組中的第五項將繼續加載帶有16的卡片)。
有人可以確認使用單個陣列可以或不能完成此操作嗎? 如果可以的話,有人可以指導我如何從正確的索引裝入卡嗎?
//
// DraggableViewBackground.m
// testing swiping
//
// Created by Richard Kim on 8/23/14.
// Copyright (c) 2014 Richard Kim. All rights reserved.
//
#import "DraggableViewBackground.h"
@implementation DraggableViewBackground{
NSInteger cardsLoadedIndex; //%%% the index of the card you have loaded into the loadedCards array last
NSMutableArray *loadedCards; //%%% the array of card loaded (change max_buffer_size to increase or decrease the number of cards this holds)
UIButton* menuButton;
UIButton* messageButton;
UIButton* checkButton;
UIButton* xButton;
}
//this makes it so only two cards are loaded at a time to
//avoid performance and memory costs
static const int MAX_BUFFER_SIZE = 2; //%%% max number of cards loaded at any given time, must be greater than 1
static const float CARD_HEIGHT = 200; //%%% height of the draggable card
static const float CARD_WIDTH = 290; //%%% width of the draggable card
@synthesize exampleCardLabels; //%%% all the labels I'm using as example data at the moment
@synthesize allCards;//%%% all the cards
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[super layoutSubviews];
[self setupView];
exampleCardLabels = [[NSArray alloc]initWithObjects:@"20",@"19",@"18",@"17",@"16",@"15",@"14",@"13",@"12",@"11",@"10",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2",@"1",@"DEATH", nil]; //%%% placeholder for card-specific information
loadedCards = [[NSMutableArray alloc] init];
allCards = [[NSMutableArray alloc] init];
cardsLoadedIndex = 0;
[self loadCards];
}
return self;
}
//%%% sets up the extra buttons on the screen
-(void)setupView
{
#warning customize all of this. These are just place holders to make it look pretty
self.backgroundColor = [UIColor colorWithRed:.92 green:.93 blue:.95 alpha:1]; //the gray background colors
menuButton = [[UIButton alloc]initWithFrame:CGRectMake(17, 34, 22, 15)];
[menuButton setImage:[UIImage imageNamed:@"menuButton"] forState:UIControlStateNormal];
messageButton = [[UIButton alloc]initWithFrame:CGRectMake(284, 34, 18, 18)];
[messageButton setImage:[UIImage imageNamed:@"messageButton"] forState:UIControlStateNormal];
xButton = [[UIButton alloc]initWithFrame:CGRectMake(60, 485, 59, 59)];
[xButton setImage:[UIImage imageNamed:@"xButton"] forState:UIControlStateNormal];
[xButton addTarget:self action:@selector(swipeLeft) forControlEvents:UIControlEventTouchUpInside];
checkButton = [[UIButton alloc]initWithFrame:CGRectMake(200, 485, 59, 59)];
[checkButton setImage:[UIImage imageNamed:@"checkButton"] forState:UIControlStateNormal];
[checkButton addTarget:self action:@selector(swipeRight) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:menuButton];
[self addSubview:messageButton];
[self addSubview:xButton];
[self addSubview:checkButton];
}
#warning include own card customization here!
//%%% creates a card and returns it. This should be customized to fit your needs.
// use "index" to indicate where the information should be pulled. If this doesn't apply to you, feel free
// to get rid of it (eg: if you are building cards from data from the internet)
-(DraggableView *)createDraggableViewWithDataAtIndex:(NSInteger)index
{
DraggableView *draggableView = [[DraggableView alloc]initWithFrame:CGRectMake((self.frame.size.width - CARD_WIDTH)/2, (self.frame.size.height - CARD_HEIGHT)/2, CARD_WIDTH, CARD_HEIGHT)];
draggableView.information.text = [exampleCardLabels objectAtIndex:index]; //%%% placeholder for card-specific information
draggableView.delegate = self;
return draggableView;
}
//%%% loads all the cards and puts the first x in the "loaded cards" array
-(void)loadCards
{
if([exampleCardLabels count] > 0) {
NSInteger numLoadedCardsCap =(([exampleCardLabels count] > MAX_BUFFER_SIZE)?MAX_BUFFER_SIZE:[exampleCardLabels count]);
//%%% if the buffer size is greater than the data size, there will be an array error, so this makes sure that doesn't happen
//%%% loops through the exampleCardsLabels array to create a card for each label. This should be customized by removing "exampleCardLabels" with your own array of data
for (int i = 0; i<[exampleCardLabels count]; i++) {
DraggableView* newCard = [self createDraggableViewWithDataAtIndex:i];
[allCards addObject:newCard];
if (i<numLoadedCardsCap) {
//%%% adds a small number of cards to be loaded
[loadedCards addObject:newCard];
}
}
//%%% displays the small number of loaded cards dictated by MAX_BUFFER_SIZE so that not all the cards
// are showing at once and clogging a ton of data
for (int i = 0; i<[loadedCards count]; i++) {
if (i>0) {
[self insertSubview:[loadedCards objectAtIndex:i] belowSubview:[loadedCards objectAtIndex:i-1]];
} else {
[self addSubview:[loadedCards objectAtIndex:i]];
}
cardsLoadedIndex++; //%%% we loaded a card into loaded cards, so we have to increment
}
}
}
#warning include own action here!
//%%% action called when the card goes to the left.
// This should be customized with your own action
-(void)cardSwipedLeft:(UIView *)card;
{
//do whatever you want with the card that was swiped
// DraggableView *c = (DraggableView *)card;
[loadedCards removeObjectAtIndex:0]; //%%% card was swiped, so it's no longer a "loaded card"
if (cardsLoadedIndex < [allCards count]) { //%%% if we haven't reached the end of all cards, put another into the loaded cards
[loadedCards addObject:[allCards objectAtIndex:cardsLoadedIndex]];
cardsLoadedIndex++;//%%% loaded a card, so have to increment count
[self insertSubview:[loadedCards objectAtIndex:(MAX_BUFFER_SIZE-1)] belowSubview:[loadedCards objectAtIndex:(MAX_BUFFER_SIZE-2)]];
}
}
#warning include own action here!
//%%% action called when the card goes to the right.
// This should be customized with your own action
-(void)cardSwipedRight:(UIView *)card
{
//do whatever you want with the card that was swiped
// DraggableView *c = (DraggableView *)card;
[loadedCards removeObjectAtIndex:0]; //%%% card was swiped, so it's no longer a "loaded card"
if (cardsLoadedIndex < [allCards count]) { //%%% if we haven't reached the end of all cards, put another into the loaded cards
[loadedCards addObject:[allCards objectAtIndex:cardsLoadedIndex]];
cardsLoadedIndex++;//%%% loaded a card, so have to increment count
[self insertSubview:[loadedCards objectAtIndex:(MAX_BUFFER_SIZE-1)] belowSubview:[loadedCards objectAtIndex:(MAX_BUFFER_SIZE-2)]];
}
}
//%%% when you hit the right button, this is called and substitutes the swipe
-(void)swipeRight
{
DraggableView *dragView = [loadedCards firstObject];
dragView.overlayView.mode = GGOverlayViewModeRight;
[UIView animateWithDuration:0.2 animations:^{
dragView.overlayView.alpha = 1;
}];
[dragView rightClickAction];
}
//%%% when you hit the left button, this is called and substitutes the swipe
-(void)swipeLeft
{
DraggableView *dragView = [loadedCards firstObject];
dragView.overlayView.mode = GGOverlayViewModeLeft;
[UIView animateWithDuration:0.2 animations:^{
dragView.overlayView.alpha = 1;
}];
[dragView leftClickAction];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
如果我對您的理解正確,則不需要數組。 我會將卡的當前索引保存為整數值,並通過檢查范圍來增加和減少它的方法。 已經有一個ivar NSInteger cardsLoadedIndex;
在我看來,這樣的方法會起作用:
- (NSUInteger) getIndexDirectionRight:(BOOL)direction{
if (direction){
return (cardsLoadedIndex < MAX_VALUE) ? cardsLoadedIndex + 1 : 0;
}else{
return (cardsLoadedIndex > 0) ? cardsLoadedIndex - 1 : MAX_VALUE;
}
}
您可以在swipeRight
或swipeLeft
調用該方法,並在initWithFrame
方法中將cardsLoadedIndex初始化為20(因為它已經設置為0)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.