如何从表格内的按钮呈现视图控制器
我有一个视图控制器,其中有一个表格视图。我有一个类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和委托=自该错误,当我从viewDidLoad中()除去这些话,就说明在self.tableview.reloadData()
我看到3,4问题错误同样的问题,但没有解决方案为我工作。 如果问题不明确,请让我知道。我会再解释一遍。
我被困在这个从几个小时。
UPDATING码
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)
}
}
你有更多的问题调试/找到你的问题,然后如何呈现视图控制器。
正如你声称错误是访问一个force-unwrapped对象,你需要找到这个对象是什么。一般情况下尽量避免不惜一切代价强行展开,因此请确保“!”符号在您的代码中找不到。这包括我不能强调不够,总是改变他们到
@IBOutlet private weak var <#name#>: <#type#>?
天气应该是强还是弱是另一个讨论,让做什么,因为我怀疑它会让你的情况的不同网点。
因此,移除力解包应该解决您的崩溃,但我认为只会产生另外一个问题,因为调用object?.doSomething()
会一筹莫展的时候,object
是nil
。因此需要调试:
- 了解异常断点。让他们始终启用。所有你需要做的就是去Xcode的断点导航,然后在底部按“+”按钮并选择“异常断点”。通过执行和运行您的应用程序,您现在应该可以找到发生错误的确切位置,因为您的应用程序将停止在该特定的代码行上。让我们知道这样做后,哪条线路导致了崩溃。
- 一般使用断点。在每一行你都可以通过按下你写的代码的左边来放置一个断点。在作为按钮动作的方法(可能是
catProfileNameBtnPressed
)中放置一个断点,并且一旦命中断点,就开始导航到下一行(使用文本编辑器下方的按钮),然后沿着管道查看哪些方法被调用,以及管道是正确的。 - 使用控制台可以在运行时在断点上打印对象。在断点处的任何时候,您都可以在控制台中打印代码结果(应该在打印日志的Xcode的右下角部分以及从
print
输出)。所有你需要做的就是写"po" + code
以获得任何价值。因此,例如,您可以在CatPlaceTableViewCell
的断点处写入“po委托”,并且您应该看到值为delegate
。如果它是nil
那么你的代表没有设置。你可以打印出复杂的信息,所以只需要得到你需要的任何东西,比如po String(data: try! JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted), encoding: 4)
就完全有效。
现在使用这些工具3找到确切位置,你的问题所在。按照执行流水线,并拿出像一个具体问题:“为什么我的按钮操作方法不能被称为”或者“为什么我代表零,尽管它已经被设置”或“为什么我的出口为零” ......
这是很常见使用navigationController在tableView.Just说,在您正在处理点按钮事件的方法,som就像这样:
let secondVC = YourViewControllerClass(customInitParam: param1, customInitParam2: param2,...)
self.navigationController?.pushViewController(secondVC, animated: true)
他询问如何呈现视图控制器推不 –
为了提供一个视图控制器只是改变 'pushViewController()' 到'.present(的ViewController:UIViewController中,动画:BOOL,CompletionHandler:() - >())' –
没错。希望它可以帮助你;) –
你能显示更多的代码 –
好吧,等待我更新代码 –
你也可以在这里打印你的错误信息 – Aximem