我有一个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

09-27 05:25