UIPickerView не может автоматически выбрать последнюю строку при компиляции под Xcode 4.5.2 и iOS 6

Я бьюсь головой о стену, пытаясь диагностировать неспособность моего приложения автоматически предварительно выбирать последний ряд UIPickerView, используя код, который успешно работал в более старых версиях XCode. Я думаю, что это ошибка в Xcode, а не в iOS 6, потому что мое старое приложение, работающее на устройстве iOS 6, работает правильно, но перекомпиляция кода в Xcode 4.5.2 не работает должным образом. Я собрал следующий пример, чтобы продемонстрировать проблему, но перед тем, как отправить отчет об ошибке, я хотел бы узнать мнение других пользователей на этом форуме, чтобы определить, связана ли проблема с моим кодом или действительно является ошибкой в ​​Xcode/iOS.

Я создал одно приложение просмотра и настроил раскадровку с контроллером навигации и двумя IBOutlets, один для UILabel, где я отображаю выбранную строку, и один для UIPickerView.

Вот файл заголовка для моего настраиваемого контроллера представления:

#import <UIKit/UIKit.h>

@interface DisposableViewController : UIViewController
    <UIPickerViewDataSource, UIPickerViewDelegate>
@end

Вот файл реализации для моего пользовательского контроллера представления:

#import "DisposableViewController.h"

const NSInteger MAX_VALUE = 10;

@interface DisposableViewController ()

@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (weak, nonatomic) IBOutlet UILabel *selectedValueLabel;

@end


@implementation DisposableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}


- (void)viewWillAppear:(BOOL)animated
{
    [self.pickerView reloadAllComponents];
    [self.pickerView selectRow:MAX_VALUE inComponent:0 animated:NO];
    self.selectedValueLabel.text = [NSString stringWithFormat:@"%d", [self.pickerView selectedRowInComponent:0]];
}


//**
//** UIPickerViewDataSource methods
//**

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


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return MAX_VALUE + 1;
}


//**
//** UIPickerViewDelegate methods
//**

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [NSString stringWithFormat:@"%d", row];
}


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    self.selectedValueLabel.text = [NSString stringWithFormat:@"%d", row];
}


@end

Вот скриншот, демонстрирующий проблему:

Скриншот

Обратите внимание, что мой код пытается автоматически выбрать последнюю строку в UIPickerView в viewWillAppear: метод, но при запуске программы метка значения получает строку как 10 при вызове [self.pickerView selectedRowInComponent:0], но визуально появляется сам UIPickerView чтобы выбрать 9. Я считаю, что это ошибка, но хотел бы другие мнения или предложения о том, как я могу решить эту проблему. Спасибо за внимание.

2 ответа

Решение

Эта ошибка вызвана опцией Use Autolayout в раскадровке, но я нашел обходной путь, который позволяет мне продолжать использовать автоматическое расположение:

Если я вызываю метод [pickerView selectRow: inComponent:] в viewDidAppear: моего контроллера представления, а не в viewWillAppear:, то UIPickerView корректно корректируется для выбора правильной строки, хотя выбор на мгновение становится видимым, поскольку средство выбора вращается от неправильного выбор к правильному.

Определенно выглядит как ошибка, связанная с новой функцией автоматического макета в iOS 6. Я испытывал то же самое, но при попытке увидеть, произошло ли это в iOS 5.1, я заметил, что она начала работать.

Попробуйте это: в раскадровке или в nib-файле отключите автоматическую компоновку.

Другие вопросы по тегам