Kortney
Kortney

Reputation: 5

UIPickerView shows up but does not load data

I am pretty new to objective c. I have looked through a ton of questions on stack overflow to try to find an answer but nothing has helped, so I appreciate any help anyone can offer.

I am trying to make an app that will have the picker view load from my array of 51 numbers. a random object will be generated from the array and if the user selects that object from the picker, an alert will show. I'm going to make a simple little guessing game, but for now I just have the picker that loads but is blank with no text. The alerts do work tho.

I have already assigned datasource and delegate to picker view on the view controller.

I need help figuring out why my picker view is not loading my array and what I can do to fix it. Thank you

here is my h file:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

@property (strong, nonatomic) IBOutlet UIPickerView *picker;

@end

here is m file:

#import "ViewController.h"

@interface ViewController ()

@property NSArray *numbers;
@property NSString * selection;
@property NSString *randomObject;
@property NSInteger rnd;


@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor darkGrayColor];

     [_numbers arrayByAddingObjectsFromArray:_numbers];

}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:      (NSInteger)component{
    return _numbers.count;
}

 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row    inComponent:(NSInteger)component{

    _numbers = @[@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26,@27,@28,@29,@30,@31,@32,@33,@34,@35,@36,@37,@38,@39,@40,@41,@42,@43,@44,@45,@46,@47,@48,@49,@50];

    //create random object from array
_rnd = arc4random() % ([_numbers count]);

_selection = [NSString stringWithFormat:@"%ld",(long)row];
_randomObject = [_numbers objectAtIndex:self.rnd];
NSLog(@"%@",self.randomObject);


    //strings for alerts
NSString *right = [[NSString alloc]initWithFormat:@"You Guessed Right! Congratulations you've earned 3 points!"];
NSString *oneOff = [[NSString alloc]initWithFormat:@"You were so close! Only 1 off! The number was %lu. Congratulations you've earned 2 points!",(unsigned long)self.rnd];
NSString *twoOff = [[NSString alloc]initWithFormat:@"You were so close! Only 2 off! The number was %lu. Congratulations you've earned 1 point!",(unsigned long)self.rnd];
NSString *threeOff = [[NSString alloc]initWithFormat:@"Nice try! You were 3 off. The number was %lu. You earned -1 point.",(unsigned long)self.rnd];
NSString *fourOff = [[NSString alloc]initWithFormat:@"Good try! You were 2 off. The number was %lu. You earned -2 points.",(unsigned long)self.rnd];
NSString *fiveOff = [[NSString alloc]initWithFormat:@"You were no where close! The number was %lu. You earned -3 points!",(unsigned long)self.rnd];

    //alerts for guesses
UIAlertView *rightAlert = [[UIAlertView alloc]initWithTitle:@"Spot On!" message:right delegate:nil cancelButtonTitle:@"Sweet!" otherButtonTitles:nil, nil];
UIAlertView *oneOffAlert = [[UIAlertView alloc]initWithTitle:@"Only one off!" message:oneOff delegate:nil cancelButtonTitle:@"Ok!" otherButtonTitles:nil, nil];
UIAlertView *twoOffAlert = [[UIAlertView alloc]initWithTitle:@"Only Two Off!" message:twoOff delegate:nil cancelButtonTitle:@"Ok!" otherButtonTitles:nil, nil];
UIAlertView *threeOffAlert = [[UIAlertView alloc]initWithTitle:@"Three Off" message:threeOff delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
UIAlertView *fourOffAlert = [[UIAlertView alloc]initWithTitle:@"Four Off" message:fourOff delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
UIAlertView *fiveOffAlert = [[UIAlertView alloc]initWithTitle:@"No Where Close!" message:fiveOff delegate:nil cancelButtonTitle:@"Ok!" otherButtonTitles:nil, nil];


NSInteger a = [_selection integerValue];


    //guessed right
if (_selection == _randomObject)
{
    [rightAlert show];

}
    //one off
if (a == (_rnd + 1) || (a == (_rnd - 1)))
{
    [oneOffAlert show];

}
    //two off
if (a == (_rnd + 2) || (a == (_rnd - 2)))
{
    [twoOffAlert show];

}
    //three off
if (a == (_rnd + 3) || (a == (_rnd - 3)))
{
    [threeOffAlert show];

}
    //four off
if (a == (_rnd + 4) || (a == (_rnd - 4)))
{
    [fourOffAlert show];

}
    //five or more off
if ((_rnd + 5) >= a || (_rnd - 5) <= a ||(_rnd - 5) >= a || (_rnd + 5) <= a)
{
    [fiveOffAlert show];

}
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return _numbers[row];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

Upvotes: 0

Views: 595

Answers (1)

Glorfindel
Glorfindel

Reputation: 22651

The problem is that this line

_numbers = @[@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26,@27,@28,@29,@30,@31,@32,@33,@34,@35,@36,@37,@38,@39,@40,@41,@42,@43,@44,@45,@46,@47,@48,@49,@50];

appears in the wrong place. It is in the pickerView:didSelectRow:inComponent: method which is only called after the user has made a selection. Therefore, your _numbers array will always be empty.

Move it to the viewDidLoad method, replacing the following statement which currently hasn't any effect at all:

[_numbers arrayByAddingObjectsFromArray:_numbers];

Also, you need to change this method:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
   return [_numbers[row] stringValue];
}

because _numbers[row] is an NSNumber, not an NSString.

Upvotes: 1

Related Questions