2016-02-11 36 views
0

我對編程相對比較陌生,這是我第一次嘗試在開發iOS時沒有遵循教程,所以請耐心等待。從自定義UITableViewCell發送數據到詳細ViewController - Swift

我有一個名爲'CupboardViewController'的自定義表格視圖,該視圖基於名爲'ItemTableViewCell'的自定義UITableViewCell類返回四個字符串標籤。當用戶點擊一個表項時,我希望能夠在一個名爲'detailViewController'的獨立視圖控制器中顯示這四個標籤。

這是我有的代碼,但它調用segue時沒有明顯的錯誤消息崩潰。請幫忙!

CupboardViewController

override func prepareForSegue(segue: UIStoryboardSegue, 
    sender: AnyObject!) { 
     // sender is the tapped `UITableViewCell` 
     let cell = sender as! ItemTableViewCell 
     let indexPath = self.tblItems.indexPathForCell(cell) 

     // load the selected model 
     let titleToPass = itemMgr.items[indexPath!.row].name 

     let detail = segue.destinationViewController as! detailViewController 
     // set the model to be viewed 
     detail.titleToPass = titleToPass 
} 

}

detailViewController

@IBOutlet weak var titleDetailLabel: UILabel! 
@IBOutlet weak var qtyDetailLabel: UILabel! 
@IBOutlet weak var dateDetailLabel: UILabel! 
@IBOutlet weak var descriptionDetailLabel: UILabel! 

var titleToPass: String! 
var qtyToPass: String! 
var descriptionToPass: String! 
var dateToPass: String! 



override func viewDidLoad() { 
    super.viewDidLoad() 

    titleDetailLabel.text = titleToPass 
    qtyDetailLabel.text = qtyToPass 
    dateDetailLabel.text = dateToPass 
    descriptionDetailLabel.text = descriptionToPass 
} 

    // Do any additional setup after loading the view. 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

ItemTableViewCell

@IBOutlet weak var itemTitle: UILabel! 
@IBOutlet weak var itemSubtitle: UILabel! 
@IBOutlet weak var itemSubDetail: UILabel! 
@IBOutlet weak var dateDetail: UILabel! 

override func awakeFromNib() { 


    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
+1

作爲一般規則,儘量避免強制展開Optionals(例如!),除非您絕對確定它們不會爲零。相反,你應該使用「如果讓」或「警惕」。這樣你可以迎合他們的零,這可能是發生了什麼事情。什麼是你得到的確切的錯誤,以及在哪一行? – Michael

回答

0

這絕對是最好避免展開力盡可能多,所以我絕對推薦在大多數情況下使用guard letif let。除了讓你免受崩潰之外,他們還提供了一些很好的方法來查看你的代碼在哪裏失敗,否則更難追蹤。

例如,你有這條線,它返回一個可選的NSIndexPath

let indexPath = self.tblItems.indexPathForCell(cell) 

而不是武力展開這個可選的,你可以稍微修改線路,使其處理爲零,並且還添加了打印告訴你這行失敗,這樣的:

guard let indexPath = self.tblItems.indexPathForCell(cell) else { 
    print("No index path returned.") 
    return 
} 

如果該值不爲零,你可以用indexPath常像往常一樣工作。你可能會希望繼續使用這些選項中的大部分,除非你100%確定它們在任何情況下都不會成立。

至於你的特定崩潰,你可以糾正我,如果我錯了,但我懷疑這是因爲你有在viewDidLoad訪問您的detailViewController這四個變量,但你只設置其中之一賽格。這意味着在viewDidLoad中,您將嘗試訪問這些(並且它們也有!),並且因爲它不會找到任何內容,所以會立即崩潰。看看是否修復該問題,並擺脫一些!有幫助。

相關問題