如果它嵌套在if语句中,如何返回tableview中的单元格

时间:2017-08-09 14:30:11

标签: ios swift uitableview

这是我的代码 - 我在if语句中返回cell1时遇到错误,因为它说“无法在void函数中返回非void返回值。我想在tableview中返回单元格..我有3种帖子..一个用于状态一用于图像一用于视频帖子。我怎样才能为每个单元返回单元格。

P.S。 :我刚刚提供了一个帖子类型的代码,就好像一个已经解决,然后所有其他的都可以解决。

import UIKit
import Alamofire
class ViewController: UIViewController , UITableViewDelegate , 
UITableViewDataSource{

@IBOutlet weak var feedTable: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()
    feedTable.dataSource = self
    feedTable.delegate = self

}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 376
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    Alamofire.request("https://new.postpfgsdfdsgshfghjoves.com/api/posts/get_all_posts").responseJSON { response in

        let result = response.result
        if let dict = result.value as? Dictionary<String,AnyObject> {

            if let successcode = dict["STATUS_CODE"] as? Int {
                if successcode == 1 {
                    if let postsArray = dict["posts"] as? [Dictionary<String,AnyObject>]
                    {
                        for i in 0..<postsArray.count
                        {
                            let posttype = postsArray[i]["media_type"] as! String
                            if posttype == "image"
                            {
                                let cell1 : ImageTableViewCell = self.feedTable.dequeueReusableCell(withIdentifier: "imageReuse") as! ImageTableViewCell

                                cell1.fullName = postsArray[i]["full_name"] as? String
                                cell1.profileImageURL = postsArray[i]["profile_pic"] as? String
                                cell1.location = postsArray[i]["location"] as? String
                                cell1.title = postsArray[i]["title"] as? String
                                cell1.postTime = postsArray[i]["order_by_date"] as? String
                                cell1.likes = postsArray[i]["liked_count"] as? Int
                                cell1.comments = postsArray[i]["comment_count"] as? Int
                                cell1.imageURL = postsArray[i]["profile_pic"] as? String
                                cell1.imageLocation = postsArray[i]["location"] as? String
                                cell1.content = postsArray[i]["content"] as? String



                                cell1.profileFullName.text = cell1.fullName
                                cell1.titleImagePost.text = cell1.title
                                cell1.postLocation.text = cell1.location
                                cell1.profileUserLocation.text = cell1.location
                                cell1.numberOfLikes.text = "\(cell1.likes!) Likes"
                                cell1.numberOfComments.text = "\(cell1.comments!) Comments"
                                cell1.postTimeOutlet.text = postsArray[i]["posted_on"] as? String
                                                        let url = URL(string: cell1.imageURL!)
                                                        let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
                                cell1.profileImage.image = UIImage(data: data!)
                                let url1 = URL(string: cell1.imageURL!)
                                let data1 = try? Data(contentsOf: url1!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
                                cell1.postedImage.image = UIImage(data: data1!)
                            //        return cell1
                            }


                            else if posttype == "status"
                            {

                                let cell1 : StatusTableViewCell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "statusReuse") as! StatusTableViewCell

                                                            cell1.fullName = postsArray[i]["full_name"] as? String
                                                            cell1.profileImageURL = postsArray[i]["profile_pic"] as? String
                                                            cell1.location = postsArray[i]["location"] as? String
                                                            cell1.title = postsArray[i]["title"] as? String
                                                            cell1.postTime = postsArray[i]["order_by_date"] as? String
                                                            cell1.likes = postsArray[i]["liked_count"] as? Int
                                                            cell1.comments = postsArray[i]["comment_count"] as? Int
                                                            cell1.postContent = postsArray[i]["content"] as? String


                                                            cell1.profileFullName.text = cell1.fullName
                                                            cell1.titleStatusPost.text = cell1.title
                                                            cell1.postLocation.text = cell1.location
                                                            cell1.profileUserLocation.text = cell1.location
                                                            cell1.content.text = cell1.postContent
                                                            cell1.numberOfLikes.text = "\(cell1.likes!) Likes"
                                                            cell1.numberOfComments.text = "\(cell1.comments!) Comments"
                                                            cell1.postTimeOutlet.text = "\(cell1.postTime!)"

                                                            let url = URL(string: cell1.profileImageURL!)
                                                            let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
                                                            cell1.profileImage.image = UIImage(data: data!)
//                                    return cell1

                            }

                            else if posttype == "video"
                            {
                                let cell1 : VideoTableViewCell = self.feedTable.dequeueReusableCell(withIdentifier: "videoReuse") as! VideoTableViewCell

                                                            cell1.fullName = postsArray[i]["full_name"] as? String
                                                            // cell1.profession = postsArray[i]["profession"] as? String
                                                            cell1.profileImageURL = postsArray[i]["profile_pic"] as? String

                                                            cell1.location = postsArray[i]["location"] as? String
                                                            cell1.title = postsArray[i]["title"] as? String
                                                            cell1.postTime = postsArray[i]["order_by_date"] as? String
                                                            cell1.likes = postsArray[i]["liked_count"] as? Int
                                                            cell1.comments = postsArray[i]["comment_count"] as? Int
                                                            cell1.videoURL = postsArray[i]["profile_pic"] as? String

                                                cell1.profileFullName.text = cell1.fullName
                                                            cell1.titleVideoPost.text = cell1.title
                                                            cell1.postLocation.text = cell1.location
                                                            cell1.profileUserLocation.text = cell1.location
                              //  return cell1
                                                        }

                            }


                        }
                    }
                }
            }
        }
      }
    }

3 个答案:

答案 0 :(得分:1)

问题是你没有返回单元格,你只是用alamofire做了一些异步请求,并从闭包中返回一个单元格的实例。

func foo() -> Int { return 1 }func bar() -> Int { someClosure { return 1 } }

首先,您需要将https://www.example.com/api/posts/get_all_posts中的数据加载到某个数据模型中。

var models: [SomeTypeYouCreate] = []

func loadData() {
   Alamofire.request(...).responseJSON { response in
      self.models = /* Create array of `SomeTypeYouCreate` objects from response */
      self.tableView.reloadData()
   }
}

func func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let model = self.models[indexPath.row]
   // configure cell with model
   return cell
}

答案 1 :(得分:1)

我的回答与其他人没有任何不同,但让我更具体一点。我将使用一个通用示例,您需要根据您的特定需求进行定制。

1)在某处为您的数据定义模型,例如:

class MyDataItem {
    var name: String
    var title: String
    var location: String

    init(name: String, title: String, location: String) {
        self.name = name
        self.title = title
        self.location = location
    }
}

2)在Viewcontroller中定义一个数组,例如:

var dataArray = [MyDataItem]()

3)从viewDidLoad方法加载可以做的数据:

override func viewDidLoad() {
    super.viewDidLoad()
    feedTable.dataSource = self
    feedTable.delegate = self
    loadData()
}

4)实现loadData()函数:

func loadData() {
    // Here put in your alamo enclosure to retrieve the data and store it into the array you've defined

   // When done, call reload data
   feedTable.reloadData()
}

5)需要修改cellForRowAt函数以从数组中检索数据。例如:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell1 : ImageTableViewCell = tableView.dequeueReusableCell(withIdentifier: "imageReuse") as! ImageTableViewCell

    cell1.fullName = dataArray[indexPath.row].name
    cell1.title = dataArray[indexPath.row].title
    cell1.location = dataArray[indexPath.row].location

    return cell1
}

无论如何,这是关于如何做你正在尝试的事情的一般想法。当从loadData函数调用reloadData时,它将导致tableview正确地从数组数据重新加载。

希望这有帮助!

答案 2 :(得分:0)

首先,您将在关闭Alamofire.request中返回值。如果您想在确认单元格值后使用单元格,则需要将完成处理程序传递给该函数并在Alamofire.reqeust中使用它...

但如果我是你,我会创建另一个在tableView函数之前/之后调用的函数。

如果是之前,则在alamofire完成时触发tableview初始化。

如果是之后,则在Alamofire中正确加载值时重新加载。

EDITED: 像其他建议一样,在tableView函数中加载数据是个坏主意。另外,通过使用Alamofire,它意味着你使用Closure。也就是说,无论你想在Alamofire中做什么都是异步发生的,意味着当你想要在Alamofire中实现的时候,你的程序可以不在表格视图中。此外,自它是闭包,Alamofire中的返回值不满足你的tableView返回类型。

所以基本上,如果你需要通过API和验证数据,你声明函数,无论你做什么做Alamofire,然后重新加载tableView。

所以流程是这样的: 1)创建一个空数组并将array.count放到#行中。

2)因为它是空的,当tableView首先尝试生成单元格时,它不会做任何事情。

3)你调用使用Alamofire的功能。如果返回值良好,则将单元格(模型)添加到数组中。

4)完成加载模型后,执行 tableView.reload()

5)Tableview调用tableView函数,现在它在数组中找到值,以便创建单元格。