自定义TableView函数没有被调用?

时间:2015-12-14 22:34:23

标签: ios swift uitableview uinavigationcontroller

在我的main.Storyboard上我有一个TableViewController,它被设置为一个带有TableViewController.swift的自定义类。

swift文件定义了所有tableview函数,并连接了UITableView的@IBOutlet。定义的类是UINavigationController,UITableViewDelegate。这个viewController是通过prepareForSegue函数从secondViewController调用的。

我还使用类UITableViewCell创建了CustomCell.swift,并为我的UITableViewCell中的标签创建了所有@IBOutlet,该标签已设置为customCell类。

我无法粘贴所有代码,但如果您需要查看任何特定代码,请告知我们,我很乐意发布该代码。

构建成功并且应用程序运行但是tableviewcells没有显示,并且没有调用任何tableview函数。我看到2个flash动画屏幕 - 表示tableviewcell可能有2个视图 - 但无法弄清楚我应该检查的位置?

//下面是触发TableViewController的segue函数

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        //print("In prepareswgue: ",segue, " ",sender)
        if(segue.identifier == "resultSegue")
        {
            let nav = segue.destinationViewController as! UINavigationController
            let svc = nav.topViewController as! TableViewController
            svc.serialNo = self.TSSerialNoField.text
    }
}


//Below is the custom TableVIewController class code
class TableViewController: UINavigationController,UITableViewDataSource, UITableViewDelegate
{
    var serialNo:String!
    var ashHardwareData: NSMutableArray!

    @IBOutlet var ResultTableView: UITableView!
    //@IBOutlet weak var LogCaseButton: UIButton!


    @IBOutlet weak var TypeResultLabel: UILabel!



    override func viewDidLoad() {
        super.viewDidLoad()

        self.ResultTableView?.allowsSelectionDuringEditing = true
        self.ResultTableView?.delegate = self
        ResultTableView?.dataSource = self
    }


    override func viewDidAppear(animated: Bool) {
        self.getHardwareData(serialNo.uppercaseString)
    }

    /*override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)
    }*/

    func getHardwareData(serialno:String)
    {
        ashHardwareData = NSMutableArray()
        ashHardwareData = ModelManager.getInstance().getHardwareData(serialno)
        ResultTableView?.reloadData()
    }
    //TableView Delegate Methods
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        print("In height func")
        return 50
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print(ashHardwareData.count)
        return ashHardwareData.count
    }

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

    func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell:ResultsCell = tableView.dequeueReusableCellWithIdentifier("results", forIndexPath: indexPath) as! ResultsCell
        let hardware:HardwareInfo = ashHardwareData.objectAtIndex(indexPath.row) as! HardwareInfo
        let contract:ContractInfo = ashHardwareData.objectAtIndex(indexPath.row) as! ContractInfo
        cell.SNOLabel.text = "Serial N0: \(hardware.SerialNo)"
        cell.ContractIDLabel.text = "Contract ID: \(contract.ContractID)"
        cell.OrgLabel.text = "Organisation: \(hardware.Organisation)"
        cell.ModelLabel.text = "Model: \(hardware.Model)"
        if(contract.DaystoExpiry > 0) {
            cell.TypeLabel.text = "Contract Type: Active"
            self.TypeResultLabel.hidden = false
            self.TypeResultLabel.text = "To log a technical case for the Hardware please click on Log Technical Case button."
            cell.LogCaseButton.hidden = false
            cell.LogCaseButton.tag = indexPath.row
        }
        else {
            cell.TypeLabel.text = "Contract Type: Expired"
            cell.LogCaseButton.hidden = true
            self.TypeResultLabel.hidden = false
            self.TypeResultLabel.text = "Support Contract for the hardware expired.  Please contact Sales team to renew the contract."
        }
        return cell
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}


//here is the code for the ResultsCell custom UITableViewCell

    import Foundation
import UIKit

class ResultsCell: UITableViewCell {


    @IBOutlet weak var SNOLabel: UILabel!

    @IBOutlet weak var LogCaseButton: UIButton!
    @IBOutlet weak var ContractIDLabel: UILabel!
    @IBOutlet weak var OrgLabel: UILabel!
    @IBOutlet weak var TypeLabel: UILabel!
    @IBOutlet weak var ModelLabel: UILabel!


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

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

2 个答案:

答案 0 :(得分:0)

您是否在故事板或ResultsCell中配置了view didload。检查一次。如果没有尝试将以下代码添加到view didload

[self.tableView registerNib:[UINib nibWithNibName:@"ResultsCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"ResultsCell"];

答案 1 :(得分:0)

我花了很多时间试图解决这个问题并决定不使用tableviewcell,而是创建了自定义viewControllers并定义了标签以显示数据库搜索的结果(工作正常)并使用执行segue函数以在viewcontrollers之间传递值。所以现在我的应用程序按照我想要的方式工作 - 从编程方面可能并不理想,但由于时间限制,我必须让它工作。 我将我的应用程序作为带有第一个和第二个ViewControllers的选项卡式应用程序。 FirstViewController将数据添加到SQLLite DB,第二个搜索数据并显示结果。为了显示结果,我创建了一个Custom viewController,其中包含我想要显示的数据的标签,并将来自DB的所有数据传递给SecondViewController函数,并使用数据更新标签。只要我得到结果,我希望我很开心。如果必须的话,我会重新访问这个以获得改进。感谢所有回答解决方案和建议的人。这是一个很好的学习经历:)