Цель C: получение значений для выбора - PullRequest
0 голосов
/ 06 июня 2011

еще один Objective-C для вас, вероятно, довольно очевидный, но я занимался этим уже несколько дней и не могу заставить его работать после траления подобных проблем здесь и в других местах!

Практически у меня есть 5-сегментный сборщик, который, когда нажимается кнопка, показывается лист предупреждения, который после принятия захватывает значения колес сборщика. Просто да, но я не могу заставить его работать, и я не уверен, где я ошибаюсь ... Некоторый код ниже ... это, вероятно, довольно плохо ... но это все довольно ново для меня, поэтому любая помощь будет оценили. Кстати, все это делается без использования InterfaceBuilder.

Все до цикла после листа действий работает нормально ... Я просто не могу вывести значения!

(ps, я надеюсь, что форматирование работает! И я изменил некоторые из моих имен и того, но все должно быть правильно)

Спасибо!

MyFile.h

@interface MyViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, UIActionSheetDelegate>
{
    UIPickerView * thePickerView;
    NSArray *thePickerValues;
}
@property (nonatomic, retain) UIPickerView *thePickerView;
@property (nonatomic, retain) NSArray *thePickerValues;

- (void)buildPicker;
- (void)doAction;

@end

MyFile.m

@implementation MyViewController
@synthesize thePickerView;
@synthesize thePickerValues;

- (void)viewDidLoad
{
    NSArray *values = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",nil];
    thePickerValues = values;
    [values release];
    [self buildPicker];
}

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

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.thePickerValues count];
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [self.thePickerValues objectAtIndex:row];
}

-(void)buildPicker
{
    CGRect pickerFrame = CGRectMake(0.0f,130.0f,320.0,100.0f);
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.delegate = self;
    pickerView.showsSelectionIndicator = YES;
    [self.view addSubview:pickerView];
    [pickerView release];
}



- (void)doAction
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:[NSString stringWithFormat:@"Blah blah"]
                                  delegate:self
                                  cancelButtonTitle:@"No!"
                                  destructiveButtonTitle:@"Yes!"
                                  otherButtonTitles:nil];
    [actionSheet showInView:self.parentViewController.tabBarController.view];
    [actionSheet release];
}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if(!(buttonIndex == [actionSheet cancelButtonIndex]))
    {
        NSLog(@"Get the picker values");
        for(int i = 0; i<5;i++)
        {
            NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];
            NSLog(@"Wheel : %i Value : %i", i, selectedValue);
            [selectedValue release];
        }
    }
}

Ответы [ 4 ]

1 голос
/ 06 июня 2011

Альтернативный ответ: thePickerView - ноль. Я не вижу, чтобы вы присваивали ему значение, верно?

1 голос
/ 06 июня 2011

В этой строке:

NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];

Вы должны знать, что NSInteger - это просто имя для int (на самом деле базовый тип зависит от ОС, но это всегда конкретный типа не объект Objective C).Или, другими словами, это не указатель.Попробуйте:

NSInteger selectedValue = [thePickerView selectedRowInComponent:i];

Я удивлен, что вы не получили предупреждение компилятора об этом.

0 голосов
/ 06 июня 2011

Как уже отмечали другие, NSInteger не является объектом.

NSInteger *selectedValue = [thePickerView selectedRowInComponent:i];

В этой строке происходит то, что selectedRowInComponent: возвращает число, указывающее индекс выбранная строка.Поскольку вместо этого вы назначаете указатель NSInteger , компьютер использует значение в качестве адреса памяти.(Когда вы объявляете Whatever *foo, это означает, что foo содержит адрес памяти, а *foo является значением по этому адресу.)

Если вы пытались разыменовать (получите значение, на которое указывает)1015 *, ваше приложение, скорее всего, вылетит.Или, что еще хуже, не сбой, а возврат ненужного мусора по этому произвольному адресу.

Что еще более важно, вы путаете то, что возвращает метод (индекс) с тем, что вы хотите (значение).1019 * Вот что вам нужно:

NSInteger selectedRow = [thePickerView selectedRowInComponent:i];
NSString *selectedValue = [thePickerValues objectAtIndex:selectedRow];

Теперь у вас есть то, что вы хотите в selectedValue, и вы можете поместить это в свой лист действий.

0 голосов
/ 06 июня 2011

NSInteger не является объектом.Это простые старые данные.Посмотрите его определение сейчас.Давай, дважды щелкни по команде на символе в твоем исходном файле.Или дважды щелкните по нему, чтобы найти его в справочном руководстве.

И это должно быть сделано.

NSInteger selectedValue = [thePickerView selectedRowInComponent:i];
NSLog(@"Wheel : %i Value : %i", i, selectedValue);
// [selectedValue release];
...