2015-07-27 5 views
1

У меня есть pickerView с данными, загруженными с веб-сайта. Я хочу установить высоту для каждой строки pickerView.pickerView разная высота строки

Вот что я пытался, но кажется, что pickerView принимает только одно значение для всех строк.

func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
    var height: CGFloat = 40 
    if categories.count != 0 { 
     return heightForView((categories[component].valueForKey("name") as? String)!, font: UIFont(name: "HelveticaNeue-Thin", size: pickerFontSize!)!, width: pickerView.frame.width) + 10 
    } 
    return height + 10 
} 

func heightForView(text: String, font: UIFont, width: CGFloat) -> CGFloat { 
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) 
    label.numberOfLines = 0 
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    label.font = font 
    label.textAlignment = .Center 
    label.text = text 
    label.sizeToFit() 
    return label.frame.height 
} 

Впервые массив категорий пуст, а rowHeightForComponent использует постоянное значение. Но когда я загрузить данные из основных данных Я хочу, чтобы мой pickerView перезагрузить себя с новой componentHeight, но это не вызывается, когда я писал:

pickerView.reloadAllComponents() 
+0

Вы уверены, что задали делегат для своего UIPickerView для своего текущего класса? – halileohalilei

+0

@halileohalilei класс 'ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {и' переопределение FUNC viewDidLoad() { super.viewDidLoad() // pickerView делегат п Datasource pickerView.dataSource = само pickerView.delegate = self' является то, что правильно? – mikle94

+0

Вы также внедрили метод 'numberOfComponents:'? – halileohalilei

ответ

1

Я думаю вид сборщика кэширует его размер информации в первый раз. , поэтому с помощью reloadAllComponents вы можете обновлять данные компонента из источника данных и делегировать, но не можете обновлять высоту строки.


обходной путь:

источник данных и делегат устанавливаются в ноль, пока ваши данные не приготовлено. как:

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Setup UI... 

    self.pickerView.dataSource = nil 
    self.pickerView.delegate = nil 
} 

и источник данных и делегат правильно установлены после того, как данные будут готовы. нравится:

func updateUI() { 

    // ...data is ready 

    self.pickerView.dataSource = self // set data source 
    self.pickerView.delegate = self // set delegate 
    self.pickerView.reloadAllComponents() 

} 
+0

Итак, что мне делать, если в первый раз у меня нет данных, и он загружается через несколько секунд после? – mikle94

+0

Я обновил свой ответ. Это может помочь. –

0

heightForView для задания высоты и viewForRow позволяет настраивать строки. Таким образом, сделайте новую высоту в методе heightForView и сделайте настройку строк в методе метода viewForRow вместо heightForView, как вы это делали прямо сейчас.

И без указания в методе heightForView, XCode не может изменить высоту. Потому что он требует heightForView.

Наконец, перезагрузите данные, когда вы получили данные, поступающие из Интернета.

+0

in rowHeightForComponent Я просто вычислил высоту моей метки, а затем вернул ее, я не делал никаких настроек там – mikle94

+0

Если вы хотите, я могу вставить весь код для лучшего понимания. – mikle94

+0

Нет, я смутился. Возможно, эта ссылка вам поможет. http://stackoverflow.com/questions/6397947/changing-uipickerview-row-height –

1

Я понял, что, когда вы звоните reloadAllComponents: все методы делегата/DataSource дозвонились кромеrowHeightForComponent:

Я нашел обходной путь, который должен решить вашу проблему. Каждый раз, когда вы хотите установить высоту строк, вызывая reloadAllComponents:, сбросьте делегат для UIPickerView. Что-то вроде этого:

pickerView.delegate = self 
pickerView.reloadAllComponents() 
+0

не работает ( – mikle94

Смежные вопросы