2017-01-11 1 views
1

Я пытаюсь создать UITableView с регулярными, нестандартными ячейками в чистом коде. Однако следующий код никогда не дает мне ячейку с надлежащим detailTextLabel, вместо этого выбирает ячейку .default.Как правильно деактивировать подзаголовок UITableViewCell в коде?

public var cellIdentifier: String { return "wordsCell" } 
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell 
    if let newCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) { 
     // Always succeeds, so it never goes to the alternative. 
     cell = newCell 
    } 
    else { 
     // This is never reached. 
     cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) 
    } 

    let word = wordAtIndexPath(indexPath: indexPath) 
    cell.textLabel?.text = word.text 
    cell.detailTextLabel?.text = word.subText 

    return cell 
} 

Это Apparantly потому dequeueReusableCell(withIdentifier:) фактически не возвращать nil, даже если клетка не в настоящее время. Вместо этого он всегда возвращает .default, если ячейки не созданы.

Другой вариант, dequeueReusableCell(withIdentifier:for:) также всегда преуспевает, так что это тоже не сработает.

Пока что невозможно создать ячейку стиля не .default в чистом коде без интерфейса Builder для определения стиля ячейки прототипа. Самое близкое, что я могу придумать, - это answer, который замечает ту же проблему. Все остальные вопросы, которые я нашел, также касаются либо проблем IB, либо пользовательских ячеек.

Кто-нибудь знает, как удалить ячейку .subtitle для просмотра таблицы без использования интерфейса Builder?

+0

Вы можете поменять порядок условных выражений? – NRitH

+0

@NRitH Наверное, нет, поскольку мы только хотим инициализировать новую ячейку, когда это необходимо. Если я поменяю условные обозначения, это будет всегда _ инициализировать новую ячейку. – SpacyRicochet

+0

Можете ли вы объяснить, чего вы пытаетесь достичь? если в каком случае вы хотите получить субтитры? – mat

ответ

1

Я думаю, что ваша проблема может заключаться в том, что вы зарегистрировали ячейку в построителе интерфейса (или в viewDidLoad) с тем же именем, что и «cellIdentifier». Вы не должны регистрировать какую-либо ячейку, если хотите использовать ячейку типа субтитров. Регистрируя ячейку, она попытается сначала создать эту ячейку (которая не будет типом субтитров ячейки).

+0

За исключением исходной раскадровки, с которой я не касался, нет файла интерфейса Builder. Таким образом, нет никакой возможности для какой-либо ячейки, имеющей этот идентификатор. Я добавил идентификатор ячейки для ясности. – SpacyRicochet

+0

Вы не должны регистрировать какую-либо ячейку, если вы удалите этот код, она должна работать. Регистрируя ячейку, она попытается сначала создать эту ячейку (которая не будет типом субтитров ячейки). –

+0

Это сработало! Можете ли вы создать ответ, чтобы я мог его принять? – SpacyRicochet

2

Я тестировал его, и он работает. Я думал, что вы хотите подкласс UItableViewCell, но вам не нужно регистрировать ячейку в этом случае.

class TableViewController: UITableViewController { 

    let wordAtIndexPath = ["one", "two", "three"] 
    let cellId = "cellId" 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    // MARK: - Table view data source 

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return wordAtIndexPath.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let word = wordAtIndexPath[indexPath.row] 
     let cell: UITableViewCell = { 
      guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId) else { 
       return UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: cellId) 
      }  
      return cell 
     }() 

     cell.textLabel?.text = "My cell number" 
     cell.detailTextLabel?.text = word 
     return cell 
    } 

} 

enter image description here

+0

блестящий. Очистите, когда увидите это, но не – brainray