简体   繁体   English

TableView重新加载数据未调用cellForRowAtIndexPath

[英]TableView Reload data is not calling cellForRowAtIndexPath

I am Using UITableView For Display some data. 我正在使用UITableView显示一些数据。 But I have Seperated the Datasource and Delegate Methods to another class. 但是我已经将数据源和委托方法分离到另一个类中。 So my TableViewController is not having Any delegate Methods. 所以我的TableViewController没有任何委托方法。 They are in Seperate Class. 他们在单独的班级。

So when the tableview loads for the First Time, It loads the values. 因此,当首次加载tableview时,它将加载值。 but when i use tableView.reloadData on a button click of a cell , It does not calls the cellForRawAtIndexPath Method. 但是当我在单元格的按钮单击上使用tableView.reloadData时,它不会调用cellForRawAtIndexPath方法。 But it calls numberOfRawsInSection and other methods. 但是它调用numberOfRawsInSection和其他方法。

Here is my Controller Class 这是我的控制器班

class AdvancedSearch: UITableViewController , PopOverViewDelegate{

@IBOutlet var model: AdvancedSearchDataModel!
let dataModel = AdvancedSearchDataModel()

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.registerNib(UINib(nibName: "AgeCell", bundle: nil), forCellReuseIdentifier: "AgeCell")
    tableView.registerNib(UINib(nibName: "ExperienceCell", bundle: nil), forCellReuseIdentifier: "ExperienceCell")
    tableView.registerNib(UINib(nibName: "CityCell", bundle: nil), forCellReuseIdentifier: "CityCell")
    tableView.registerNib(UINib(nibName: "StateCell", bundle: nil), forCellReuseIdentifier: "StateCell")
    tableView.registerNib(UINib(nibName: "DateTimeCell", bundle: nil), forCellReuseIdentifier: "DateTimeCell")
    tableView.registerNib(UINib(nibName: "GenderCell", bundle: nil), forCellReuseIdentifier: "GenderCell")
    tableView.registerNib(UINib(nibName: "ResultButtonCell", bundle: nil), forCellReuseIdentifier: "ResultButtonCell")

    //tableView.dataSource = model
    //tableView.delegate = model
    tableView.separatorColor = UIColor.grayColor()
    tableView.allowsSelection = false
    tableView.separatorStyle = UITableViewCellSeparatorStyle.None

}

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

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    tableView.reloadData()
}




// MARK: - DropDown PopOver Delegates

func valueOfTheFieldWhenSelect(tableViewCell: UITableViewCell, value: String, indexPath: NSIndexPath) {

        let data = AdvancedSearchDataModel()
        data.buttonTitle = value
        self.tableView.delegate = data
        self.tableView.dataSource = data
        self.tableView.reloadData()

}

Here is my Datasource and Delegates in Seperate Class 这是我的数据源和单独班级的代表

class AdvancedSearchDataModel: NSObject , UITableViewDataSource , UITableViewDelegate , AdvanceSearchDropDownButtonDelegate , UIPopoverPresentationControllerDelegate {


let data = ["Age","Experience","City" , "State" , "Gender" , "Date and Time"]

// set this proprty in PopOverViewDelegate method
var buttonTitle : String?




// MARK: - TableView Datasource

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("Count : \(data.count)")
    return data.count + 1
}

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

    switch indexPath.row {
    case 0:
        let cell = tableView.dequeueReusableCellWithIdentifier("AgeCell", forIndexPath: indexPath) as! AgeCell
        applyStyleForButton(cell.selectAge)
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)
        let additionalSeparator = UIView(frame: frame)
        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)

        if buttonTitle != nil {
            cell.selectAge.setTitle(buttonTitle, forState: .Normal)
        }

        cell.indexPath = indexPath
        cell.dropDownDelegate = self

        return cell
    case 1:
        let cell = tableView.dequeueReusableCellWithIdentifier("ExperienceCell", forIndexPath: indexPath) as! ExperienceCell
        applyStyleForButton(cell.selectExperinceBtn)
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    case 2:
        let cell = tableView.dequeueReusableCellWithIdentifier("CityCell", forIndexPath: indexPath) as! CityCell
        applyStyleForButton(cell.cityButton)
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    case 3:
        let cell = tableView.dequeueReusableCellWithIdentifier("StateCell", forIndexPath: indexPath) as! StateCell
        applyStyleForButton(cell.stateButton)
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    case 4:
        let cell = tableView.dequeueReusableCellWithIdentifier("GenderCell", forIndexPath: indexPath) as! GenderCell
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    case 5:
        let cell = tableView.dequeueReusableCellWithIdentifier("DateTimeCell", forIndexPath: indexPath) as! DateTimeCell
        applyStyleForButton(cell.datebutton)
        applyStyleForButton(cell.timeButton)
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    case 6:
        let cell = tableView.dequeueReusableCellWithIdentifier("ResultButtonCell", forIndexPath: indexPath) as! ResultButtonCell
        let frame = CGRectMake(0, cell.frame.size.height - 2, cell.frame.size.width,2)

        let additionalSeparator = UIView(frame: frame)

        additionalSeparator.backgroundColor = UIColor.grayColor()
        cell.addSubview(additionalSeparator)
        return cell
    default:
        return UITableViewCell()
    }




}



// MARK: - TableView Delegates

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    if indexPath.row == 5 {
        return 150
    }else{
        return 94
    }

}

// MARK: - Styling

func applyStyleForButton(button : UIButton){

    button.layer.borderColor = UIColor.grayColor().CGColor
    button.layer.borderWidth = 1
    button.layer.cornerRadius = 5
    button.backgroundColor = UIColor.clearColor()

}


// MARK: - DropDown Delegates


func openAgeDropDown(by button: UIButton, and cell: AgeCell,indexPath : NSIndexPath)
{
    print("Age opened")
    let tableViewController = DropDownController(style: .Plain, menuItems: ["10","20","30"],cell: cell , index: indexPath)
    tableViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
    tableViewController.preferredContentSize = CGSizeMake(button.frame.width, button.frame.width)

    // assigning the delegate in tableView to fill the textfield
    tableViewController.delegate = AdvancedSearch()

    let popoverPresentationController = tableViewController.popoverPresentationController
    popoverPresentationController?.permittedArrowDirections = .Any
    popoverPresentationController?.delegate = self
    popoverPresentationController?.sourceView = button
    popoverPresentationController?.sourceRect = button.bounds

    UIApplication.sharedApplication().keyWindow?.rootViewController!.presentViewController(tableViewController, animated: true, completion: nil)

}


// MARK: - PopOver Delegates

  func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.None
}}

Please Guide me 请引导我

The methods is not calling because everytime you are creating a new object of AdvancedSearchDataModel . 该方法未调用,因为每次您都创建AdvancedSearchDataModel的新对象时。 instead this assign delegate in viewDidLoad. 相反,此分配委托在viewDidLoad中。 don't need to create new object of AdvancedSearchDataModel 不需要创建AdvancedSearchDataModel新对象

in viewDidLoad viewDidLoad

...
tableView.separatorColor = UIColor.grayColor()
tableView.allowsSelection = false
tableView.separatorStyle = UITableViewCellSeparatorStyle.None
tableView.delegate = self.model
 tableView.dataSource = self.model

and in valueOfTheFieldWhenSelect 并在valueOfTheFieldWhenSelect

func valueOfTheFieldWhenSelect(tableViewCell: UITableViewCell, value: String, indexPath: NSIndexPath) {

    self.model.buttonTitle = value
    self.tableView.reloadData()
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM