2016-07-31 1 views
2

Пробовал понять это на некоторое время сейчас и после нескольких часов поиска решения, я решил, что пришло время спросить.Segue от UITableViewCell, нажав на изображение внутри ячейки

У меня есть табличное представление, которое заполняется пользовательскими UITableViewCells, и в настоящее время, когда вы нажимаете на ячейку, вы получаете подробный вид.

В пользовательской ячейке есть изображение, я хотел бы, чтобы пользователь мог нажать на это изображение и перейти к всплывающему VC, который показывает изображение.

У меня возникают проблемы с созданием segue при нажатии на изображение.

В файле для пользовательской ячейке, я создал кран жест распознаватель на изображение (PTAP):

override func awakeFromNib() { 
    super.awakeFromNib() 

    let tap = UITapGestureRecognizer(target: self, action: #selector(PostCell.voteTapped(_:))) 
    let ptap = UITapGestureRecognizer(target: self, action: #selector(PostCell.imageTapped(_:))) 
    tap.numberOfTapsRequired = 1 
    ptap.numberOfTapsRequired = 1 
    voteImage.addGestureRecognizer(tap) 
    voteImage.userInteractionEnabled = true 
    featuredImg.addGestureRecognizer(ptap) 
    featuredImg.userInteractionEnabled = true 


} 

У меня также есть функции в файле пользовательских ячейки для водопроводная:

func imageTapped(sender: UIGestureRecognizer) { 

    print("image tapped") 


} 

на мой взгляд, файл контроллера я добавил SEGUE в сделал выберите строку с индексом пути:

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

    let post: Post! 

    if inSearchMode { 
     post = filteredVenues[indexPath.row] 
    } else { 

     post = posts[indexPath.row] 
    } 

    print(post?.venueName) 

    performSegueWithIdentifier("imageTapped", sender: nil) 



    performSegueWithIdentifier("DetailsVC", sender: post) 

} 

Кроме того, в раскадровке я создал segue из VC, который хранит табличное представление с пользовательскими ячейками в VC, которые я хотел бы показать, когда изображение будет прослушиваться.

Я пробовал несколько разных способов заставить это работать и не повезло, код, который вы видите выше, остается после моих многочисленных неудачных попыток. Я чувствую, что функция для крана в пользовательском файле ячейки и segue в файле VC является частью решения, поэтому я их оставил.

Любая помощь будет оценена. Благодаря!

Updates закодировать из ответов ниже: протокол

Добавлено

protocol ImageSegueProtocol: class { 
    func imageTapped(row: Int) 
} 


class PostCell: UITableViewCell { 

Добавлено IAB Func

@IBAction func imageTapped(sender: UIGestureRecognizer) { 
    guard let row = row else { return } 
    delegate?.imageTapped(row) 
    print("image tapped func") 
} 

Объявлены делегат в главном VC

weak var delegate:postCell? 

Assigned Del Ворота

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

    //let post = posts[indexPath.row] 

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell { 

     var img: UIImage? 
     var vImg: UIImage? 
     postCell?.delegate = self 

функция расширения Добавлено

extension FeedVC: ImageSegueProtocol { 

func imageTapped(row: Int) { 
    if inSearchMode == true { 
     let object = filteredVenues[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } else { 
     let object = posts[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } 



} 
+0

ли вы создали делегат на свой мобильный вид таблицы? –

+0

Эй, Ран, нет, я не – ryanbilak

ответ

0

Что вам нужно сделать, это создать кнопку вместо изображения и эта кнопка будет содержать реальное изображение:

enter image description here

Остальное легко, ctrl перетащите IBAction в свой файл сот. Теперь вам нужно связаться с вашим контроллером просмотра, чтобы вызвать метод segue.

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

  1. Использование post notification:

    Внутри вашего View Controller добавить наблюдателя:

    NSNotificationCenter.defaultCenter().addObserver(self, 
              selector: #selector(YourViewController.cellSelected(_:)), 
              name: "CellSelectedNotificationName", 
              object: nil) 
    

    Ваш метод cellSelected внутри View Controller должен выглядят так:

    func cellSelected(notification : NSNotification) 
    { 
        if let passedObject = notification.object as? YourCustomObject 
        { 
        // Do what ever you need with your passed object 
        // When you're done, you can invoke performeSegue that will call prepareForSegue 
        // When invoking performeSegue you can pass your custom object 
        } 
    } 
    

    Внутри вашего класса CustomCell в методе IBAction вашей кнопки:

    @IBAction func buttonTapped() 
    { 
        // Prepare the object you want to pass... 
        NSNotificationCenter.defaultCenter().postNotificationName("CellSelectedNotificationName", object: YourCustomObjectYouWantToPass) 
    } 
    

    В скорлупе ореха, прослушивались кнопка внутри ячейки, вы создали объект внутри этой клетки, и вы передаете его вид Контроллер с использованием центра уведомлений. Теперь вы можете выполнить свой заказ.

ПРИМЕЧАНИЕ: Если вам не нужно передать объект, который вы можете в основном Ctrl + перетаскивание с вашего UIButton (в раскадровке) другой View Controller.

  1. Использование delegate, указывающее на контроллер просмотра.

Удачи.

+0

Спасибо Ohad, я попробую это. Можете ли вы дать мне некоторую информацию о делегате, который должен указать на ВК? – ryanbilak

+0

Я добавил ссылки для каждого дизайна, взгляните на них. Если вы все равно не получите этого, дайте мне знать, я добавлю пример. – OhadM

+0

Удивительное спасибо, я посмотрю и вернусь к вам в случае необходимости – ryanbilak

3

Вы можете сделать это следующим образом:

внутри файла ячейки, объявить протокол в верхней части, а затем настроить некоторые свойства в классе клеток себя и поведение делегата в ответ на изображение прослушиваются:

protocol SomeCellProtocol: class { 
    func imageTapped(row: Int) 
} 


class SomeCell: UITableViewCell { 

    weak var delegate: SomeCellProtocol? 
    var row: Int? 

    @IBAction func imageTapped() { 
     guard let row = row else { return } 
     delegate?.imageTapped(row) 
    } 
} 

вы должны затем сделать ваш ViewController принять SomeCellProtocol и вызвать SEGUE в как так:

extension SomeViewController: SomeCellProtocol { 

    func imageTapped(row: Int) { 
     //get object from array and call segue here 
    } 
} 

и вы должны установить ваш Vie wController в качестве делегата от ваших клеток по телефону:

someCell.delegate = self 

и передать строку в ячейке:

someCell.row = indexPath.row 

в вашем методе cellForRowAtIndexPath в ViewController.

Итак, когда кнопка отображается в ячейке (или вы можете сделать это с помощью GestureRecognizer на ImageView, если хотите), это заставит делегат (ViewController) вызвать функцию imageTapped, передав параметр строки, который вы можете использовать для определения того, какой объект в таблице (соответствующий массив данных) должен быть передан через Segue.

+0

Спасибо Росс, вы можете помочь мне получить объект из массива в расширении VC? Просто нужно некоторое объяснение, что именно вы имеете в виду. – ryanbilak

+0

В принципе, вам нужно знать, какой объект вы хотите отображать. Вы передали строку ячейке, и она возвращает строку в методе делегата, поэтому просто используйте эту строку, чтобы получить объект из вашего массива: let object = filtersVenues [row], если вы находитесь в режиме поиска или let object = posts [row], если нет! – RossP

+0

Спасибо, это будет выглядеть так? 'Расширение FeedVC: ImageSegueProtocol { FUNC imageTapped (строка: Int) { , если inSearchMode == истинные { Объект = filteredVenues [строка] performSegueWithIdentifier ("imageTapped", отправитель: ноль) } еще { Объект = сообщений [строка] performSegueWithIdentifier ("imageTapped", отправитель: ноль) } } } 'И будет делегатом быть:.' PostCell() делегирует = self' PostCell является файл для моих пользовательских ячеек – ryanbilak

0

Как сказал OhadM, создайте кнопку и установите фоновое изображение в качестве изображения, которое вы хотите отобразить. Оттуда вам даже не нужен IBAction. Управляйте перетаскиванием с кнопки на контроллер следующего вида и создавайте сегмент.

Затем, если вы хотите сделать какие-либо настройки до Segue, в первом VC вы бы что-то вроде:

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

     if segue.identifier == "imageButtonPressed" { // Make sure you name the segue to match 

      let controller = segue.destinationViewController as! SecondVC 
      controller.someText = "Hi" 
      controller.someInt = 5 
     } 
}