TableView重新加载数据不会调用cellForRowAtIndexPath

时间:2016-10-28 09:12:10

标签: iphone swift xcode uitableview

我正在使用UITableView For Display一些数据。但我已将数据源和委托方法分离到另一个类。所以我的TableViewController没有任何委托方法。他们是单独的。

因此,当tableview加载第一次时,它会加载值。但是当我在单击按钮时使用tableView.reloadData时,它不会调用cellForRawAtIndexPath方法。但它调用numberOfRawsInSection和其他方法。

这是我的控制器类

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()

}

这是我在单独类中的数据源和代理

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
}}

请指导我

1 个答案:

答案 0 :(得分:2)

每次创建AdvancedSearchDataModel的新对象时,方法都不会调用。而是在viewDidLoad中分配委托。不需要创建AdvancedSearchDataModel

的新对象 viewDidLoad

中的

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

并在valueOfTheFieldWhenSelect

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

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