静态表视图的错误

时间:2015-12-10 14:16:06

标签: ios swift uitableview tableview

尝试在我的应用程序中计算出几个场景,我无法让tableViews正常工作。

我正在执行 tableView 等设置,用户在两个可能的设置之间进行选择。每个选项都会导致新的tableView,用户必须选择其中一个可用选项。一旦用户选择了一个,第一个场景中的标签将显示所选的值(也存储为NSUserDefaults)。因此,如果我没有弄错,这可以用3个静态tableViews来实现。下面的代码就是我试图这样做的方法:

初始设置视图控制器:

class SettingsVC2: UITableViewController{
 override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 2
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if indexPath.section == 0{

        let cell = tableView.dequeueReusableCellWithIdentifier("office_cell", forIndexPath: indexPath)
        cell.textLabel?.text = "Select your office"
        return cell
}
    else {
        let cell = tableView.dequeueReusableCellWithIdentifier("dept_cell", forIndexPath: indexPath)
        cell.textLabel?.text = "Select your department"
        return cell
   }

其中一个设置tableViews:

class SettingsDepartmentTVC: UITableViewController{

let departamentos: [String] = ["Sales", "Pre-Sales", "General Administration", "Customer Service", "Profesional Services", "Regionales"]

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return departamentos.count
}
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {

}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("department_cell", forIndexPath: indexPath)
    cell.textLabel?.text = self.departamentos[indexPath.row]
    return cell

}
}

我相信所有的数据源和代理都是正确的,即使没有显示也会导入UIKit。

Erros Im:

  

断言失败 - [UITableView   dequeueReusableCellWithIdentifier:forIndexPath:]

     

由于未捕获的异常而终止应用   ' NSInternalInconsistencyException',原因:'无法将单元格出列   标识符为office_cell - 必须注册一个笔尖或一个类   标识符或连接故事板中的原型单元

这是我尝试填充tableView的方法:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
    -> UITableViewCell{


    let cell = tableView.dequeueReusableCellWithIdentifier("CommentsRowTVC", forIndexPath: indexPath) as! CommentsRowTVC

    let single_comment = self.AOS[indexPath.row]

    cell.titulo_comentario?.text = single_comment.titulo_comment
        cell.cuerpo_comentario?.text = single_comment.cuerpo_comment
    cell.fecha_comentario?.text = single_comment.fecha_comment
    return cell
}

class CommentsRowTVC: UITableViewCell {


@IBOutlet weak var titulo_comentario: UILabel!
@IBOutlet weak var cuerpo_comentario: UILabel!
@IBOutlet weak var fecha_comentario: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

这是UIViewController的连接检查器,其中表是:

Outlets

这个用于UIViewCellController:

Outlets2

到目前为止的错误:

  

UIView tableView:numberOfRowsInSection:发送到实例的无法识别的选择器

     

由于未捕获的异常而终止应用程序NSInvalidArgumentException,原因:[UIView tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例

2 个答案:

答案 0 :(得分:2)

如果您真正制作静态表格视图单元格,那么您应该删除这些方法。只有在动态出列单元格时才使用它们。

t.notify()

如果您实际上正在尝试制作动态单元格,那么,正如您的错误消息所示,您需要确保您的标识符与界面构建器中的标识符相匹配:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return departamentos.count
}
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {

}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("department_cell", forIndexPath: indexPath)
    cell.textLabel?.text = self.departamentos[indexPath.row]
    return cell

}

答案 1 :(得分:1)

使用您提供的代码,您似乎没有在表格视图中注册表格视图单元格和标识符。

How can I prevent SQL injection in PHP?

  

讨论在出列任何单元格之前,请调用此方法或   registerNib:forCellReuseIdentifier:告诉表视图的方法如何   创造新的细胞。如果当前不是指定类型的单元格   在重用队列中,表视图使用提供的信息   自动创建一个新的单元格对象。

     

如果您以前使用相同的重用注册了类或nib文件   标识符,您在cellClass参数中指定的类将替换   旧条目。如果需要,可以为cellClass指定nil   从指定的重用标识符中取消注册该类。

我建议你在viewDidLoad()注册它们。

    let KDepartmentCellIdentifier = "department_cell"
    tableView.registerClass(UITableViewCell.class, forCellReuseIdentifier: kKDepartmentCellIdentifier)

    let KOfficeCellIdentifier = "office_cell"
    tableView.registerClass(UITableViewCell.class, forCellReuseIdentifier: kOfficeCellIdentifier)

如果您使用的是笔尖,请使用

registerNib(_ nib: UINib?, forCellReuseIdentifier identifier: String)