2017-10-09 79 views
-1

我有一個視圖控制器,其中有一個表格視圖。我有一個類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) 
} 

}

+0

你能顯示更多的代碼 –

+0

好吧,等待我更新代碼 –

+0

你也可以在這裏打印你的錯誤信息 – Aximem

回答

0

你有更多的問題調試/找到你的問題,然後如何呈現視圖控制器。

正如你聲稱錯誤是訪問一個force-unwrapped對象,你需要找到這個對象是什麼。一般情況下儘量避免不惜一切代價強行展開,因此請確保「!」符號在您的代碼中找不到。這包括我不能強調不夠,總是改變他們到

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

天氣應該是強還是弱是另一個討論,讓做什麼,因爲我懷疑它會讓你的情況的不同網點。

因此,移除力解包應該解決您的崩潰,但我認爲只會產生另外一個問題,因爲調用object?.doSomething()會一籌莫展的時候,objectnil。因此需要調試:

  1. 瞭解異常斷點。讓他們始終啓用。所有你需要做的就是去Xcode的斷點導航,然後在底部按「+」按鈕並選擇「異常斷點」。通過執行和運行您的應用程序,您現在應該可以找到發生錯誤的確切位置,因爲您的應用程序將停止在該特定的代碼行上。讓我們知道這樣做後,哪條線路導致了崩潰。
  2. 一般使用斷點。在每一行你都可以通過按下你寫的代碼的左邊來放置一個斷點。在作爲按鈕動作的方法(可能是catProfileNameBtnPressed)中放置一個斷點,並且一旦命中斷點,就開始導航到下一行(使用文本編輯器下方的按鈕),然後沿着管道查看哪些方法被調用,以及管道是正確的。
  3. 使用控制檯可以在運行時在斷點上打印對象。在斷點處的任何時候,您都可以在控制檯中打印代碼結果(應該在打印日誌的Xcode的右下角部分以及從print輸出)。所有你需要做的就是寫"po" + code以獲得任何價值。因此,例如,您可以在CatPlaceTableViewCell的斷點處寫入「po委託」,並且您應該看到值爲delegate。如果它是nil那麼你的代表沒有設置。你可以打印出複雜的信息,所以只需要得到你需要的任何東西,比如po String(data: try! JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted), encoding: 4)就完全有效。

現在使用這些工具3找到確切位置,你的問題所在。按照執行流水線,並拿出像一個具體問題:「爲什麼我的按鈕操作方法不能被稱爲」或者「爲什麼我代表零,儘管它已經被設置」或「爲什麼我的出口爲零」 ......

-1

這是很常見使用navigationController在tableView.Just說,在您正在處理點按鈕事件的方法,som就像這樣:

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

他詢問如何呈現視圖控制器推不 –

+1

爲了提供一個視圖控制器只是改變 'pushViewController()' 到'.present(的ViewController:UIViewController中,動畫:BOOL,CompletionHandler:() - >())' –

+0

沒錯。希望它可以幫助你;) –

相關問題