【问题标题】:TableView Reload data is not calling cellForRowAtIndexPathTableView 重新加载数据未调用 cellForRowAtIndexPath
【发布时间】:2016-10-28 09:12:09
【问题描述】:

我正在使用 UITableView 来显示一些数据。但我已将数据源和委托方法分离到另一个类。所以我的 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
}}

请指导我

【问题讨论】:

  • 使用多个nib而不是直接在目标表视图中方便地设计所有单元格的原因是什么?
  • 我有很多自定义单元格。所以 TableViewController 本身没有可用空间。这就是为什么我通过笔尖加载它们

标签: iphone swift xcode uitableview


【解决方案1】:

这些方法没有调用,因为每次您都在创建 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()
 }

【讨论】:

  • 我会尽力让你知道@sahil。非常感谢
  • 它给我带来了一个错误。告诉 self.model 是 nil
  • 因为属性没有连接。从故事板连接它。
  • 我已连接@Sahil。它第一次加载单元格。但是当我需要再次重新加载时,它会抛出错误
  • 我认为它没有连接。在 viewDidLoad print(self.model) 中检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多