2015-01-30 4 views
0

Я занимаюсь этим некоторое время - я пытаюсь передать данные из ячейки UITableView, которая использует основные данные для нового представления , Я пробовал много разных переменных в рамках подготовки кода Segue, но продолжаю использовать ошибку неразрешенного идентификатора - см. Код ниже - что мне не хватает?Пытается передать данные ядра из таблицыView в новое представление, когда выбрана строка - продолжайте получать ошибки

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier = "myEventsCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyEventsTableViewCell 

    let eventData = myEvents [indexPath.row] 
    cell.eventNameLabel.text = "Name: " + eventData.eventName 
    cell.startDateLabel.text = "Start: " + eventData.startDate 
    cell.endDateLabel.text = "End: " + eventData.endDate 

    cell.backgroundColor = UIColor.clearColor() 

    return cell 
} 

override func prepareForSegue (segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "showEventDetails" { 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
      let destinationController = segue.destinationViewController as eventDetailView 
      destinationController.eventNameLabel.text = "Name: " + eventData.eventName [indexPath.row] 
      destinationController.eventStartLabel.text = "Start: " + eventData.startDate [indexPath.row] 
      destinationController.eventEndLabel.text = "End: " + eventData.endDate [indexPath.row] 
      destinationController.eventDetailLabel.text = eventData.details [indexPath.row] 
     } 
    } 
} 
+0

Не перефразируйте ошибки; вставьте фактическую ошибку в свой вопрос. Также сообщите нам, где вы получите ошибку (какая строка, если вы ее знаете). – rdelmar

ответ

0

Как ваш segue знает объект, который вы хотите перенести? Вы пропустили называть объект таким образом, как:

let thisTask = fetchedResultsController.objectAtIndexPath(indexPath!) as YOUROBJECT 

или что-то еще, если вы не используете NSFetchedResultController - например: пусть данныеСобытия = myEvents [indexPath]

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

0

Что eventData в:

"Name: " + eventData.eventName [indexPath.row] 

Если выше код работает, почему бы вам не использовать снова конструкта

let eventData = myEvents [indexPath.row] 

, а затем

destinationController.eventNameLabel.text = "Name: " + eventData.eventName 
    /* code */ 

для доступа к значениям для вашего контроллера назначения?

0

Поскольку вы не опубликовали свою ошибку, я не знаю, вызывает ли это ошибку, но вы не можете установить текст метки в контроллере назначения, как вы пытаетесь сделать. В момент вызова метода prepareForSegue был создан экземпляр конечного контроллера, но его представление еще не загружено. Таким образом, его выходы будут равны нулю. Вы должны создать свойства строки в контроллере представления назначения и передать ему строки. Залейте метки в viewDidLoad.

0

Я думаю, что ваша ошибка связана с eventData, которая не определена в prepareForSegue. Лучший подход к передавая данные из выбранной ячейки в контроллер представления подробно выглядит следующим образом:

// I assume you have an existing class eventData 
class EventData { 
    var eventName: String! 
    // other properties 
} 

class MyEventsTableViewCell: UITableViewCell { 

    @IBOutlet var eventNameLabel: UILabel! 
    // other outlets 

    // Add this property to your tableview cell 
    // Now your cell has a direct reference to the eventData, we will use that in the prepareForSegue function 
    var eventData: EventData! { 
     didSet { 
      eventNameLabel.text = "Name: " + eventData.eventName 
      // other properties 
     } 
    } 

} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier = "myEventsCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyEventsTableViewCell 

    let eventData = myEvents [indexPath.row] 

    // Here you can set the eventData for the cell, this will automatically set the outlets. 
    cell.eventData = eventData 

    cell.backgroundColor = UIColor.clearColor() 

    return cell 
} 



override func prepareForSegue (segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "showEventDetails" { 
     // The sender parameter represents the selected cell 
     let selectedCell = sender! as MyEventsTableViewCell 
     // now we have a reference to the eventData for this selected cell 
     let eventData = selectedCell.eventData 

     let destinationController = segue.destinationViewController as eventDetailView 
     // we pass the eventData to the destinationController (you will have to add a eventData property to the destinationController) 
     destinationController.eventData = eventData 

    } 
} 

Вы не должны получить прямой доступ к выходам на destinationController, как пояснил @rdelmar. Вместо этого создайте свойство для eventData. Когда загружается представление destinationController, вы можете использовать это свойство для установки точек просмотра детали.

Еще одно предложение по именованию: ваш контроллер назначения имеет имя класса eventDetailView. Это запутанно, потому что это не вид, а viewcontroller. Я бы предложил переименовать его в EventDetailViewController или что-то похожее на ваш вкус.

+0

Спасибо Peter this - был очень полезен - я думаю, что я близок, но считаю, что я сейчас что-то теряю в eventDetailView. Вы упомянули о настройке свойства там, которое я сделал, но не уверен, что еще мне не хватает - я получаю сообщение об ошибке при нажатии на мое подробное представление, в котором говорится, что dynamiccastClass безусловный –

+0

Это может быть проблема, не связанная с тем, t получить это далеко из-за предыдущих ошибок. Это немного догадки без вашего кода, но есть некоторые вещи, которые нужно проверить. Имя класса в раскадровке соответствует имени класса detailVC? Если появится detailVC, он отобразит правильные данные о событиях? –

+0

это может усложниться, но я попытаюсь объяснить - у меня есть контроллер табличного представления - и внутри него у меня есть заголовок - это представление заголовка - это то, что я пытаюсь заполнить этими данными в качестве адресата, - поэтому его на самом деле не view view, но вид внутри tableviewcontroller - у меня есть класс для представления, настроенного как имя класса - tableViewcontroller еще не закодирован, но все же его классифицируют как UITableVIewController - это то, что я пытаюсь сделать с кодом segue, чтобы перейти к возможно, мнение, в отличие от контроллера вида? если нет, какие-либо предложения? заранее заблаговременно –