Javanoob33
Javanoob33

Reputation: 89

using an array objective C / iOS

so I'm creating a contact list app and I'm storing everything into an NSMutableArray. I've managed to get add function working perfectly. But I'm struggling with the Previous/Next functions.

I can get it to go back one object in the array when pressing previous, but i Can't get it to go back any further? here's my code: I have two extra classes, PhoneBookEntry which is a subclass of the Person class. These classes contain three strings, Firstname,lastname and studentID

- (IBAction)addPerson:(id)sender {
  PhonebookEntry *person = [[PhonebookEntry alloc] init];
  NSLog(@"%@",self.firstName.text);
  self.currentIndex++;
  person.firstName   = self.firstName.text;
  person.lastName    = self.lastName.text;
  person.phoneNumber = self.phoneNumber.text;
  [self.entries addObject:person];
  NSLog(@"%@", self.entries);
  [self arrayLength ];

I've created a property to hold the current index.

@property (nonatomic, assign) NSInteger currentIndex;

I've created a method which then -1 from the currentINdex;

self.currentIndex = [self.entries count] - 1;

heres my button previous.

- (IBAction)btnPrevious:(id)sender {
  //[self prevObject];
  int length;
  length = [self.entries count];

  if (length > 0) {
    NSLog(@"%@", self.entries[self.currentIndex--]);
    // NSLog(@"object %@", [self.entries objectAtIndex:index]);
  } 
  else {
    NSLog (@"No contacts have been entered. No");
  }

I can get it to go back once, but when I press it a second time Iget the following error.

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'

Theres definitely data in there as I get it to print whats in the array, it also prints when I press previous also. happens no matter how many times I press the add button.

thanks

Upvotes: 1

Views: 96

Answers (3)

iPatel
iPatel

Reputation: 47049

For Previous

 - (IBAction)btnPrevious:(id)sender
    {
        if(self.currentIndex <= 0)
        {
           self.currentIndex = [self.entries count] - 1;
           NSLog(@"%@", self.entries[self.currentIndex])
        }
        else
        {
          self.currentIndex --;
          NSLog(@"%@", self.entries[self.currentIndex])
         }
    }

For Next

    - (IBAction)btnNext:(id)sender
    {
        if(self.currentIndex >= [self.entries count] - 1)
        {
           self.currentIndex = 0;
           NSLog(@"%@", self.entries[self.currentIndex])
        }
        else
        {
          self.currentIndex ++;
          NSLog(@"%@", self.entries[self.currentIndex])
        }
    }

Hope this will working for you.

Upvotes: 1

cweinberger
cweinberger

Reputation: 3588

Better:

Previous Index:

// in order to go back you need to make sure that you're not already
// on index 0 and that you've items to go back to
if([self.entries count] > 1 && self.currentIndex > 0) {
    self.currentIndex--;
}

Next Index:

// in order to go forward you need to make sure that you're not already
// on the last element
if(self.currentIndex < ([self.entries count] - 1)) {
    self.currentIndex++;
}

Some further explanation on the root cause of your problem:

The main problem is, that you use currentIndex--. This will use the old currentIndex (which is 2) before decreasing the value. If you want to use the decreased value in this statement, you have to apply the decreasing before, i.e. by writing --currentIndex instead.

  • --expression = pre-decrement operator
  • expression-- = post-decrement operator

The pre-decrement operator does decrease the value and return the decreased value while the post-decrement operator will decrease the value by 1 and return the initial value.

Upvotes: 3

m-farhan
m-farhan

Reputation: 1426

i think you are starting from end of list

self.currentIndex = [self.entries count] - 1;

if current index is @ 1 and you have 2 items in array adding an other will give you error try this

NSLog(@"%@", self.entries[self.currentIndex--]);

Upvotes: 2

Related Questions