如何从表格单元格内的按钮显示视图控制器

时间:2017-10-09 12:39:41

标签: ios swift uitableview

我有一个视图控制器,里面有一个tableview。我有一个ProductCell.swift类和控制器ProductVC.swift。我需要的是,当有人点击tableCell中的用户名按钮时,它应该呈现配置文件视图控制器。 here is the error image link . the error in description is : unexpectedily found nil while unwrapping an optional 我试过了:

self.window?.rootViewController!.presentViewController(vc, animated: true, completion: nil)

我也试过打电话给代表。

上述两种解决方案都提供相同的错误代码。

错误显示在tableview数据源和delegate = self上,当我从viewDidLoad()中删除它们时,它会在self.tableview.reloadData()上显示错误

我在同一个问题上看到了3,4个问题,但没有一个解决方案适合我。 如果问题不明确,请告诉我。我会再解释一下。

我被困在这几个小时。

更新代码

FOR CatPlaceTableViewCell

import UIKit

protocol TableViewCellDelegate
{
   func buttonDidClicked()
}

class CatPlaceTableViewCell: UITableViewCell{
var delegate: TableViewCellDelegate?


@IBOutlet weak var sponsoredView: UIView!
@IBOutlet weak var catProfilePic: UIImageView!

@IBOutlet weak var catProfileName: UIButton!

@IBAction func catProfileNameBtnPressed(_ sender: Any) {
    self.delegate?.buttonDidClicked()


}
@IBOutlet weak var catPostTime: UILabel!

@IBOutlet weak var catPostImage: UIImageView!

@IBOutlet weak var catPostTitle: UILabel!



override func awakeFromNib() {
    super.awakeFromNib()



}

func configureCell(post : PlacesDetails)
{

    catPostTitle.text = post.title
    catProfileName.setTitle(post.fullName, for: .normal)
    catPostTime.text = post.postTime

}
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}


}

FOR PlaceCategoryVC:

import UIKit
import Alamofire
import SDWebImage

class PlaceCategoryVC: UIViewController , UITableViewDataSource , UITableViewDelegate , TableViewCellDelegate{




@IBOutlet weak var headerPanel: UIView!

@IBOutlet weak var searchLocation: UISearchBar!

@IBOutlet weak var applyFIlter: UIButton!

@IBOutlet weak var resetFilter: UIButton!

@IBAction func applyFilterBtnPressed(_ sender: Any) {
}

@IBAction func resetFilterBtnPressed(_ sender: Any) {
}

////////////////////////////

@IBOutlet weak var catPostTable: UITableView!


typealias DownloadComplete1 = () -> ()

var post : PlacesDetails!
var posts = [PlacesDetails]()


override func viewDidLoad() {
    super.viewDidLoad()

    catPostTable.dataSource = self
    catPostTable.delegate = self

    downloadPostData {}


}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : CatPlaceTableViewCell = catPostTable.dequeueReusableCell(withIdentifier: "catPlaces", for: indexPath) as! CatPlaceTableViewCell
//       cell.delegate = self
    if(indexPath.row % 5 == 4)
    {
        cell.sponsoredView.isHidden = false
    }
    else
    {
        cell.sponsoredView.isHidden = true
    }

    cell.catProfilePic.sd_setImage(with: URL(string: posts[indexPath.row].profileImageURL), placeholderImage: UIImage(named: "default_image.png"))
    cell.catPostImage.sd_setImage(with: URL(string: posts[indexPath.row].contentURL), placeholderImage: UIImage(named: "placeholder.png"))
    let post1 = posts[indexPath.row]
    cell.configureCell(post: post1)

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("\(posts[indexPath.row].postid)")
    let indexpath1 = posts[indexPath.row].postid
    UserDefaults.standard.setValue(indexpath1, forKey: "postIdOfSinglePOst")
    let viewController:UIViewController = self.storyboard!.instantiateViewController(withIdentifier: "SinglePostSB") as UIViewController

    self.present(viewController, animated: true, completion: nil)
}

func downloadPostData(completed: @escaping DownloadComplete1) {
    var  i = 1
    repeat {
        Alamofire.request("https://www.EXAMPLE.COM?category=places&page=\(i)").responseJSON { response in
            let result = response.result
            print(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 obj in postsArray
                            {
                                let post = PlacesDetails(postDict: obj)
                                self.posts.append(post)
                                print(self.posts)

                            }
                            self.catPostTable.reloadData()
                        }
                    }
                }
            }
        }
        i = i + 1
    }
        while(i<2)

    completed()
}

var delegate: TableViewCellDelegate?
func buttonDidClicked()
{
    let vc = ProductVC()

    self.present(vc, animated: true, completion: nil)
}

}

2 个答案:

答案 0 :(得分:0)

在调试/查找问题以及如何呈现视图控制器时,您遇到了更多问题。

当你声称错误是访问强制解包的对象时,你需要找到这个对象是什么。一般情况下尽量避免不必要的力量展开,所以要确保&#34;!&#34;在您的代码中找不到符号。这包括我不能强调的出口,总是将它们变成

@IBOutlet private weak var <#name#>: <#type#>?

天气它应该是弱的还是强的是另一个讨论所以做任何事情,因为我怀疑它会对你的情况产生影响。

因此,删除强制解包应修复崩溃,但我认为这只会产生另一个问题,因为当object?.doSomething()object时,调用nil将不会执行任何操作。所以需要调试:

  1. 了解异常断点。让它们始终启用。您需要做的就是在Xcode中进行断点导航,然后在底部按下&#34; +&#34;按钮并选择&#34;异常断点&#34;。通过执行和运行您的应用程序,您现在应该找到错误发生的确切位置,因为您的应用程序将停止在该特定代码行上。这样做后,请告诉我们导致崩溃的原因。
  2. 一般使用断点。在每一行上,您可以通过按下您编写的代码的左侧来放置断点。在方法中放置一个断点,该方法是按钮的动作(可能是catProfileNameBtnPressed),一旦命中断点,就开始导航到下一行(使用文本编辑器正下方的按钮)并按照管道查看哪些方法是调用,如果管道是正确的。
  3. 使用控制台在运行时在断点处打印对象。在断点处的任何时候,您都可以在控制台中打印代码结果(应该在Xcode的右下角部分打印日志并从print输出)。您需要做的就是写"po" + code以获得任何价值。所以例如你可以写&#34; po delegate&#34;在CatPlaceTableViewCell中的断点时,您应该看到delegate的值。如果是nil,则表示您的代理未设置。您可以打印出复杂的消息,以便获得所需的任何内容,例如po String(data: try! JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted), encoding: 4)完全有效。
  4. 现在使用这3个工具找出问题所在。按照执行管道提出一个具体问题,例如&#34;为什么我的按钮操作方法没有被调用&#34;或者&#34;为什么我的代表是零,尽管它已被设置&#34;或者&#34;为什么我的出口没有&#34; ...

答案 1 :(得分:-1)

在tableView.Just put中使用navigationController是非常常见的,在你处理点击按钮事件的方法中,如下所示:

  let secondVC = YourViewControllerClass(customInitParam: param1, customInitParam2: param2,...)
        self.navigationController?.pushViewController(secondVC, animated: true)