2017-02-17 3 views
1

Я пытаюсь использовать метод heightForRowAtIndexPath в своем UITableViewController. Но когда я пытаюсь переопределить метод, он говорит, что он не отменяет никаких методов из своего суперкласса.Как использовать метод heightForRowAtIndexPath?

Googling привел меня к протоколам, которые потенциально могут быть частью головоломки, но я все еще пытаюсь понять, как использовать протокол для использования этого метода.

Любая помощь была бы принята с благодарностью. Вот код: (проблемный метод находится в самом низу)

import UIKit 
import Firebase 

class FruitsTableViewController: UITableViewController { 
    let rootRef = FIRDatabase.database().reference() 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 15 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath) 

     let busRef = rootRef.child("buses") 
     busRef.observeSingleEvent(of: .value, with: {(snapshot) in 
      if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] { 
       let bus = snapshots[Int(indexPath.row)].key 
       let busval = snapshots[Int(indexPath.row)].value as! String 
       cell.textLabel?.text = "Bus \(bus) ------- \(busval)" 
      } 
     }) 

     return cell 
    } 

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return "Section \(section)" 
    } 

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return 40.0 
    } 
} 

ответ

6

Вы можете установить либо статическую высоту:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
{ 
    if indexPath.section == 0 { 
     return 50 
    } else { 
     return 120 
    } 
} 

Или использовать автоматическое измерение, с изменяет размер каждой ячейки автоматически в соответствии с его содержанием :

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
+0

Отличный ответ, спасибо. Установка высоты строки в пользовательскую в Main.storyboard и настройку высоты там не работает. –

0

У вас есть:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

Замените его:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

[Я не уверен ли вы нужен override, но если вы это сделаете, компилятор скажет вам об этом, и вы можете вернуть его.]

+0

Все, что вам нужно сделать в таких ситуациях, как это посмотреть в документах. Для этой функции документы находятся здесь: https://developer.apple.com/reference/uikit/uitableviewdelegate/1614998-tableview – matt

0

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

+0

Нет - он может удалить «переопределить», а код будет _compile_. Но это не будет _work_, потому что у него неправильная подпись метода. – matt

0

Удалить «переопределение» и следующий код должен работать

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
{ 
    return 75.0 
} 
3

Используйте следующий код

func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    return 50.0 
} 
Смежные вопросы