2016-06-09 3 views
0

У меня есть один вид таблицы с большим количеством ячеек. Каждая ячейка имеет одно изображение и одну метку. И мне нужно, когда когда-либо пользователь нажимает любую ячейку, он должен идти к деталям viewcontroller.And, мне нужно показать соответствующее имя изображения и метки в моем контроллере подробных представлений. Как это сделать.как передать значение из ячейки таблицы зрения для просмотра контроллера

Я сделал все segue.But в моем подробном контроллере представления у меня есть одно изображение и label.Now, как я могу показать изображение и имя метки - когда я выбираю любую ячейку из моего представления таблицы?

import UIKit 

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

    @IBOutlet var tableView: UITableView! 
    var valueToPass:String! 
var selectedIndexPath: NSIndexPath = NSIndexPath() 

    var tableData: [String] = ["Christ Redeemer", "Great Wall of China", "Machu Picchu","Petra","Pyramid at Chichén Itzá","Roman Colosseum","Taj Mahal"] 
    var arrImageName: [String] = ["ChristRedeemer", "GreatWallOfChina", "MachuPicchu","Petra","PyramidChichenItza","RomanColosseum","TajMahal"] 

var tableRate: [String] = ["$120", "$100", "$222","$1000","$500","$900","$2000"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

    } 

    func numberOfSectionsInTableView(tableView: UITableView) ->Int 
    { 
    return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.tableData.count; 
    } 

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

     let cell:CustomTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell") as! CustomTableViewCell 

     cell.imageVW.image = UIImage(named:self.arrImageName[indexPath.row]) 

     cell.lblName.text = self.tableData[indexPath.row] 
     cell.rateName.text = self.tableRate[indexPath.row] 

     return cell 
    } 


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     self.selectedIndexPath = indexPath 

     performSegueWithIdentifier("DetailView", sender: indexPath) 
    } 


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 
     let indexPath = self.selectedIndexPath 

     if (segue.identifier == "DetailView") { 
      var viewController = segue.destinationViewController as! DetailVC 
      viewController.data = UIImagePNGRepresentation(UIImage(named:self.arrImageName[indexPath.row])!)! 
      //viewController.name = self.tableData[[indexPath.row]] 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

Вот мой detailvc.swift

import UIKit 

class DetailVC: UIViewController { 


    var data: NSData = NSData() 
    var name: String = String() 



    @IBOutlet weak var ImgView: UIImageView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.ImgView.image = UIImage(data: data) 
     //self.detailLabelNamee.text = name 
    } 






} 

ответ

3

изменить ваш сделал выбор что-то вроде этого

Объявить один gloabal indexPath в ViewContrller например,

var selectedIndexPath: NSIndexPath = NSIndexPath() 

Изменение didselect как этот

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.selectedIndexPath = indexPath 
    self.performSegueWithIdentifier("DetailView", sender: self) 
} 

Теперь в методе prepareForSegue добавить

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 
    let indexPath = self.selectedIndexPath 

    if (segue.identifier == "DetailView") { 
     var viewController = segue.destinationViewController as! DetailVC 
     viewController.data = UIImagePNGRepresentation(UIImage(named:self.arrImageName[indexPath.row])) 
     viewController.name = self.tableData[indexPath.row] 
    } 
} 

Теперь добавьте два глобальный идентификатор в DetailVC, как показано ниже

var data: NSData = NSData() 
var name: String = String() 

Теперь назначьте эти данные и строку изображение и метка в поле зрения

изменить вид сверхуVC

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.ImgView.image = UIImage(data: data) 
    self.detailLabelNamee.text = name 
} 

Hop это поможет.

+0

я получаю сообщение об ошибке, что 'член Instance«данные»не могут быть использованы на типа«DetailVC»' – mark

+0

Но как я могу присвоить изображение, этикетки имя в моей Подробный диспетчер представлений. Потому что, когда я выбираю любую ячейку, мне нужно показать это конкретное изображение ячейки и имя в моем следующем контроллере подробного представления. Правильно ?? .. Так что только я сделал iboutlet для изображения, наклейка на мой контроллер представления подробностей. Теперь я сделал вы решили. Но просто создайте переменную. Как я могу назначить изображение, имя ярлыка в контроллере подробного представления? – mark

+0

Я отредактировал свой ответ и добавлю viewdidload. –

0

Вы можете объявить переменную для хранения indexpath в этом.

вар selectedItemIndex = Int()

на щелчку ячейки записи ниже линии в didselectowatndexaPath

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     selectedItemIndex = indexPath.row 
     self .performSegueWithIdentifier(“YourViewController”, sender: nil) 
    } 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     let yourVC = segue.destinationViewController as! YourViewController 


     yourVC.text = tableData[selectedItemIndex] 
     yourVC.image = UIImage(named:arrImageName[selectedItemIndex]) 
    } 
0

Вы почти у цели! Строка: performSegueWithIdentifier («DetailView», отправитель: self)

необходимо изменить. «self» передает ссылку текущего контроллера представления на метод prepareForSegue. Если вы измените «self» на «indexPath», тогда prepareForSegue увидит путь индекса ячейки в объекте «sender», и вы берете то, что от вас хотите.

Вы могли бы сделать что-то вроде:

if (segue.identifier == "yourSegueIdentifer") { 
    var viewController = segue.destinationViewController as! DetailVC 
    let indexPath = sender as! NSIndexPath 
    viewController.passedImageName = self.arrImageName[indexPath.row] 
    viewController.passedData = self.tableData[indexPath.row] 
    viewController.passedRate = self.tableRate[indexPath.row] 

и в DetailVC:

class DetailVC: UIViewController { 
    var passedImageName:String! 
    var passedData:String! 
    var passedRate:String! 
+0

Но как я могу назначить изображение, имя метки в контроллере подробного представления. Поскольку, когда я выбираю любую ячейку, мне нужно показать это конкретное изображение ячейки и имя в моем следующем контроллере подробного представления. Правильно? ..Только я сделал iboutlet для изображения, наклейка на мой контроллер представления подробностей. Теперь я сделал вам решение. Но это просто создание переменной. Как я могу назначить изображение, имя метки в моем контроллере подробных представлений? – mark

+0

Я получаю эту ошибку при сбое 'Не могу отличить значение типа SimpleTable.CustomTableViewCell '(0x106060908) до' NSIndexPath '(0x10686b438) .' под этой строкой' let indexPath = sender as! NSIndexPath' – mark

1

В вашей didSelectRowAtIndexPath вы можете просто выполнить SEGUE и prepareForSegue вы можете получить indexPath с self.tableView.indexPathForSelectedRow. И, конечно же, он возвращает необязательный вариант, и вы должны сначала проверить его на предмет безопасности.Я думаю, что это самый простой способ.

0

В вашем didSelectRowAtIndexPath вы можете получить путь указателя к выбранной строке, а затем вы можете выполнитьSegue и передать путь индекса в отправителе. В prepareForSeque, с указательный путь, вы можете получить изображение, tableData и tableRate. Который вы можете перейти к подробному просмотру. Что-то, как показано ниже

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    performSegueWithIdentifier("DetailView", sender: indexPath) 
} 



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 
    let selectedIndexPath = sender as! NSIndexPath 

    if (segue.identifier == "DetailView") { 
     var viewController = segue.destinationViewController as! DetailVC 

viewController . setValues(tableData:tableData[selectedIndexPath] , rate: tableRate[selectedIndexPath] , imageName:arrImageName[selectedIndexPath]) 
} 


class DetailVC: UIViewController { 

    var imageName:String! 
    var tableData:String! 
    var tableRate:String! 



func setValues(tableData:String , rate:String , imageName:String){ 
imageName = tableData 
tableRate = rate 
imageName = imageName 

} 

или

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 
    let selectedIndexPath = sender as! NSIndexPath 

    if (segue.identifier == "DetailView") { 
     var viewController = segue.destinationViewController as! DetailVC 

viewController.imageName = self.arrImageName[selectedIndexPath.row] 
viewController.tableData = self.tableData[selectedIndexPath.row] 
viewController.tableRate = self.tableRate[selectedIndexPath.row] 
} 
Смежные вопросы