为什么不同表视图控制器中的titleForheaderInsection方法不起作用?

时间:2015-09-02 06:02:34

标签: ios iphone swift uitableview

为什么不同的表视图控制器中的titleForheaderInsection方法不起作用?

我在一个故事板中为我的应用创建了两个表视图控制器,具有不同的功能,一个是SettingsTableViewControlelr,一个是CitylistTableViewControlelr,它们应该有不同的部分标题。

tableView:titleForHeaderInSection方法用于命名节标题,但遗憾的是只有SettingsTableViewControlelr中的方法在iOS模拟器中才能正确显示,但CitylistTableViewControlelr中的方法不起作用,我把tableView:titleForHeaderInSection方法上的断点,找到甚至不在CitylistTableViewControlelr中调用的方法。以下是我的代码:

  

SettingsTableViewController

import UIKit

class SettingsTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// MARK: - Table view data source

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

override func tableView(tableView: UITableView, titleForHeaderInSection section:Int) -> String? {
    switch section{
    case 0:
        return"Settings"
    default:
        return nil
    }
}
//the "tableView:titleForHeaderInSection" method in class SettingsTableViewController 
//is called and section title appears on simulator.

override func tableView(tableView: UITableView,heightForHeaderInSection section:Int) -> CGFloat {
    return 44
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("settingsIdentifier", forIndexPath: indexPath) as! UITableViewCell

    return cell
}    
}
  

CitylistTableViewControlelr

import UIKit

class CityListTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 2
}

func tableView(tableView: UITableView, titleForheaderInsection section: Int) -> String? {
    switch section {
    case 0:
        return "Top Cities"
    case 1:
        return "Other Cities"
    default:
        return nil
    }
}
//Putting a breakpoint here, and find "tableView:titleForHeaderInSection" method in 
//CityListTableViewController is not even been called, thus the section titles, "Top Cities" & "Other Cities", 
//do not appear in simulator.I have tried to add "override" keyword before the method, but the 
//complier report error says "Method does not override any method from its superclass". 

override func tableView(tableView: UITableView,heightForHeaderInSection section:Int) -> CGFloat {
    return 44
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section{
    case 0:
        return 12
    case 1:
        return 15
    default:
        return 0
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cityListIdentifier", forIndexPath: indexPath) as! UITableViewCell
    switch indexPath.section{
    case 0:
        cell.textLabel!.text=topCitiesList[indexPath.row]
    case 1:
        cell.textLabel!.text=otherCitiesList[indexPath.row]
    default:
        cell.textLabel!.text="unknown"
    }
    return cell
}   
}
  

我的问题是:

  1. 为什么不在tableView:titleForHeaderInSection中调用CityListTableViewController方法?
  2. 如何更正我的代码以使章节标题分别出现在模拟器/ iPhone上?

1 个答案:

答案 0 :(得分:2)

看看两者之间的差异:

在调用它的第一个视图控制器中,函数声明如下:

override func tableView(tableView: UITableView, titleForHeaderInSection section:Int) -> String? {
    switch section{

在一个未被调用的情况下,它被声明为:

func tableView(tableView: UITableView, titleForheaderInsection section: Int) -> String? {
    switch section {

您缺少覆盖声明。此外,你没有在第二个声明中大写“标题”(感谢你指出Jesper)。