2016-02-11 5 views
0

Я относительно новичок в программировании, и это моя первая попытка разработать iOS, не следуя инструкциям, поэтому, пожалуйста, несите меня.Отправка данных из пользовательского UITableViewCell в детали ViewController - Swift

У меня есть пользовательский вид таблицы под названием «CupboardViewController», который возвращает четыре строковых метки на основе пользовательского класса UITableViewCell под названием «ItemTableViewCell». Я хочу, чтобы показывать эти четыре метки в отдельном контроллере представления, называемом «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

Как правило, старайтесь избегать принудительного разворота опций (например, как!), Если вы не уверены, что они не будут никчемными. Вместо этого вы должны использовать «if let» или «guard». Таким образом, вы можете ухаживать за ними за ноль, что, вероятно, происходит именно так. Какова точная ошибка, которую вы получаете, и на какой строке? – Michael

ответ

0

Это, безусловно, лучше, чтобы избежать силы UnWrap ! как можно больше, поэтому я бы рекомендовал в большинстве случаев использовать guard let или if let. В дополнение к спасению вас от сбоев, они также предлагают несколько отличных способов увидеть, где именно находится ваш код, который в противном случае будет более жестким для отслеживания.

Например, у вас есть эта линия, которая возвращает необязательный NSIndexPath

let indexPath = self.tblItems.indexPathForCell(cell) 

Вместо силы разворачивая это необязательно, вы можете немного изменить линию, чтобы сделать его обрабатывать ноль, а также добавить печать сказать вы, что эта линия не удалась, как это:

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

Если значение не ноль вы можете работать с indexPath постоянной, как обычно. Вероятно, вам захочется продолжить этот подход с большинством этих опций, если вы на 100% не уверены, что они не будут ни в какой ситуации.

Что касается вашей конкретной аварии, вы можете исправить меня, если я ошибаюсь, но я подозреваю, что это потому, что у вас есть эти четыре переменные на вашем detailViewController, к которым обращаются в viewDidLoad, но вы устанавливаете только один из них в снегом. Это означает, что в viewDidLoad вы будете пытаться получить к ним доступ (и у них есть также !), и поскольку он не найдет ничего, он немедленно сработает. Посмотрите, исправляет ли это, и избавляется от некоторых из ! s.