我正在使用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
}}
请指导我
答案 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()
}