我有一个viewController。在那我有一个按钮,如果我单击该按钮,则在该viewController上呈现一个UIView。
在那个UIVew中,我有一个tableView。现在我想将数据传递到从服务器获取的该tableview中。
我无法在tableView中显示数据,我保留了断点并进行了检查。也无法进入cellForRowAt indexPath方法
有人可以帮我吗
这是我尝试过的代码
这是我的UIView类
class ButtonClicked: UIView {
@IBOutlet weak var tableView: UITableView!
override func didMoveToSuperview() {
//super.awakeFromNib()
}
这是我的ViewController类
class ViewController: UIViewController{
var tableviewDisplayArray: NSArray = []
override func viewDidLoad() {
super.viewDidLoad()
buttonClicked.tableView.register(UINib(nibName: “TableViewDisplayCell", bundle: nil), forCellReuseIdentifier: “tableViewDispCell")
buttonClicked.tableView.delegate = self
buttonClicked.tableView.dataSource = self
}
@IBAction func addMoneyButtonClicked() {
buttonClickedWebserviceCall()
actionAlertViewController.actionType = ActionAlertType.ADD_MONEY
present(self.view.actionAlertPopup(alertVC: actionAlertViewController), animated: animated, completion: nil)
}
func buttonClickedWebserviceCall(){
let params: NSDictionary = ["langId" : “1”, "countryId" : “1”]
callingWebservice().dataTaskWithPostRequest(urlrequest: URL_BUTTONCLICKED viewcontroller: self, params: params) { (result, status) in
let response : NSDictionary = result as! NSDictionary
let status = response.value(forKey: "httpCode") as! NSNumber
if status == 200{
DispatchQueue.main.async {
self.tableviewDisplayArray= (response.value(forKey: “response”) as? NSArray)!
print(self.tableviewDisplayArray)
self.buttonClicked.tableView.reloadData()
}
}
else{
DispatchQueue.main.async {
}
}
}
}//method close
}//class close
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == buttonClicked.tableView {
return tableviewDisplayArray.count
}
else{
return 5
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if tableView == buttonClicked.tableView {
return 30.0
}
else{
return 75.0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == buttonClicked.tableView {
let cell = buttonClicked.tableView.dequeueReusableCell(withIdentifier: "tableViewDispCell", for: indexPath) as! TableViewDisplayCell
let storedArray = self.tableviewDisplayArray.object(at: indexPath.row) as! NSDictionary
print(storedArray)
return cell
}
else{
let cell = tableView.dequeueReusableCell(withIdentifier: “normalCell”, for: indexPath) as! NormalCell
return cell
}
}
}
最佳答案
您已经在UIViewController类的扩展中编写了tableView委托方法。只需在设置了委托和数据源的ViewController类中编写该代码即可。
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource{
var tableviewDisplayArray: NSArray = []
override func viewDidLoad() {
super.viewDidLoad()
buttonClicked.tableView.register(UINib(nibName: “TableViewDisplayCell", bundle: nil), forCellReuseIdentifier: “tableViewDispCell")
buttonClicked.tableView.delegate = self
buttonClicked.tableView.dataSource = self
}
@IBAction func addMoneyButtonClicked() {
buttonClickedWebserviceCall()
actionAlertViewController.actionType = ActionAlertType.ADD_MONEY
present(self.view.actionAlertPopup(alertVC: actionAlertViewController), animated: animated, completion: nil)
}
func buttonClickedWebserviceCall(){
let params: NSDictionary = ["langId" : “1”, "countryId" : “1”]
callingWebservice().dataTaskWithPostRequest(urlrequest: URL_BUTTONCLICKED viewcontroller: self, params: params) { (result, status) in
let response : NSDictionary = result as! NSDictionary
let status = response.value(forKey: "httpCode") as! NSNumber
if status == 200{
DispatchQueue.main.async {
self.tableviewDisplayArray= (response.value(forKey: “response”) as? NSArray)!
print(self.tableviewDisplayArray)
self.buttonClicked.tableView.reloadData()
}
}
else{
DispatchQueue.main.async {
}
}
}
}//method close
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == buttonClicked.tableView {
return tableviewDisplayArray.count
}
else{
return 5
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if tableView == buttonClicked.tableView {
return 30.0
}
else{
return 75.0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == buttonClicked.tableView {
let cell = buttonClicked.tableView.dequeueReusableCell(withIdentifier: "tableViewDispCell", for: indexPath) as! TableViewDisplayCell
let storedArray = self.tableviewDisplayArray.object(at: indexPath.row) as! NSDictionary
print(storedArray)
return cell
}
else{
let cell = tableView.dequeueReusableCell(withIdentifier: “normalCell”, for: indexPath) as! NormalCell
return cell
}
}
//Notice that tableView delegate methods should be in your ViewController class because that is the 'self' here so delegate and datasource is the ViewController class
//buttonClicked.tableView.delegate = self
//buttonClicked.tableView.dataSource = self
//as you write this the tableview looks for data in this ViewController class.
//Extensions are meant for another purpose.
}
//class close