不显示详细信息(副标题)文本。但是,数据是可用的,因为当添加println()调用时,它会向控制台输出带有预期数据的Optional(“data”)。在故事板中,UITableViewController设置为正确的类,Table View Cell Style设置为“Subtitle”,重用标识符设置为“cell”。如何显示字幕信息?
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
dispatch_async(dispatch_get_main_queue(), { () -> Void in
cell.textLabel.text = self.myArray[indexPath.row]["title"] as? String
cell.detailTextLabel?.text = self.myArray[indexPath.row]["subtitle"] as? String
println(self.myArray[indexPath.row]["subtitle"] as? String)
// The expected data appear in the console, but not in the iOS simulator's table view cell.
})
return cell
}
答案 0 :(得分:43)
您的代码看起来很好。只需转到故事板并选择您的tableview的单元格 - >现在转到Attributes Inspector并选择Subtitle样式。
按照以下截图进行操作。
希望它有所帮助......
答案 1 :(得分:26)
这里有同样的问题(从我读过的内容,也许是iOS 8中的一个错误?),这就是我们解决这个问题的方法:
从故事板中删除原型单元
删除此行:
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
let cellIdentifier = "Cell" var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? UITableViewCell if cell == nil { cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: cellIdentifier) }
更新Swift 3.1
let cellIdentifier = "Cell"
var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.value2, reuseIdentifier: cellIdentifier)
}
Swift 4.2更新 - 简化
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value2, reuseIdentifier: "cellId")
答案 2 :(得分:15)
如果您仍想使用故事板中的原型单元格,请选择UITableViewcell样式作为字幕。它会起作用。
答案 3 :(得分:6)
如果以编程方式执行此操作而没有在界面构建器中使用单元格,则此代码的工作方式类似于Swift 2.0 +中的魅力
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
yourTableView.delegate = self
yourTableView.dataSource = self
yourTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return yourTableViewArray.count
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell: UITableViewCell = yourTableView.dequeueReusableCellWithIdentifier("subtitleCell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = "the text you want on main title"
cell.detailTextLabel?.text = "the text you want on subtitle"
return cell
}
答案 4 :(得分:4)
如果在尝试将文本设置为非零值时将文本设置为nil,则将缺少包含该文本的实际视图。这是在iOS8中引入的。请尝试设置为空格@" "
字符。
答案 5 :(得分:3)
尝试一下对我有用(Swift 4.2)
let cell = UITableViewCell(style: .value1, reuseIdentifier: "cellId")
cell.textLabel.text = "Déconnexion"
cell.imageView.image = UIImage(named: "imageName")
目标c:
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellId"];
答案 6 :(得分:2)
它的价值:我没有出现细节问题。那是因为我已经注册了tableView单元格,因为单元格原型是直接在情节提要中定义的,所以我不应该这样做。
答案 7 :(得分:2)
在Xcode11和Swift5中,我们必须执行以下操作。 如果通过检查条件cell == nil然后使用cellStyle创建UITableViewCell来执行此操作,则它将不起作用。下面的解决方案为我工作。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: cellIdentifier)
cell?.textLabel?.text = "Title"
cell?.detailTextLabel?.text = "Sub-Title"
return cell!
}
答案 8 :(得分:0)
这是swift 5的工作原理,即在视图控制器中使用UITableView对象使用detailtextlabel获取字幕,如果您缺少其中任何一个,它将无法正常工作,并且可能会崩溃。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
在viewDidLoad中:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "subtitleCell")
代理功能:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Fetch a cell of the appropriate type.
let cell = UITableViewCell(style: .subtitle , reuseIdentifier: "subtitleCell")
// Configure the cell’s contents.
cell.textLabel!.text = "Main Cell Text"
cell.detailTextLabel?.text = "Detail Cell Text"
return cell
}
答案 9 :(得分:0)
xcode 11
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "reuseIdentifier")
cell.detailTextLabel?.text = "Detail text"
cell.textLabel?.text = "Label text"
// Configure the cell...
return cell
}
答案 10 :(得分:0)
以上某些解决方案并不完全正确。由于单元应该被重用,而不是重新创建。您可以更改init方法。
final class CustomViewCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .value1, reuseIdentifier: reuseIdentifier)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
答案 11 :(得分:0)
带有字幕文本的 Swift 5,这里无需在 viewDidLoad 中注册您的单元格:
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if cell == nil {
cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
}
cell?.textLabel?.text = "title"
cell?.textLabel?.numberOfLines = 0
cell?.detailTextLabel?.text = "Lorem ipsum"
cell?.detailTextLabel?.numberOfLines = 0
return cell ?? UITableViewCell()
答案 12 :(得分:0)
三个属性将在未来版本中弃用:imageView
textLabel
和 detailTextLabel
您可以使用 UIListContentConfiguration
来配置单元
dataSource = UITableViewDiffableDataSource(tableView: tableview, cellProvider: { tableview, indexPath, menu in
let cell = tableview.dequeueReusableCell(withIdentifier: self.profileCellIdentifier, for: indexPath)
var content = cell.defaultContentConfiguration()
content.text = menu.title
if indexPath.section == MenuSection.info.rawValue {
content.image = UIImage(systemName: "person.circle.fill")
content.imageProperties.tintColor = AppColor.secondary
}
if let subtitle = menu.subTitle {
content.secondaryText = subtitle
}
cell.contentConfiguration = content
return cell
})