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
Вот скриншот, демонстрирующий проблему:
![Screenshot]()
Обратите внимание, что мой код пытается автоанализировать последнюю строку в UIPickerView в методе viewWillAppear:, но когда программа запускается, метка значения получает строку как 10 при вызове [self.pickerView selectedRowInComponent: 0], но UIPickerView сам визуально, кажется, выбрал 9. Я считаю, что это ошибка, но хотелось бы, чтобы другие мнения или предложения о том, как я могу решить эту проблему. Спасибо за внимание.
Ответы
Ответ 1
Эта ошибка вызвана опцией Use Autolayout в раскадровке, но я нашел обходное решение, которое позволяет мне продолжать использовать автоматический макет:
Если я вызову метод [pickerView selectRow: inComponent:] в viewDidAppear: моего диспетчера представлений, а не в viewWillAppear:, тогда UIPickerView правильно настроится, чтобы выбрать правильную строку, хотя выбор моментально отображается, когда выборщик вращается от неправильного выбора до правильного.
Ответ 2
Определенно выглядит ошибка, связанная с новой функцией автоматического компоновки в iOS 6. Я испытывал то же самое, но, пытаясь выяснить, произошло ли это в iOS 5.1, я заметил, что он начал работать.
Попробуйте следующее: в файле раскадровки или файла nib отключите автоматический макет.