2015-07-13 5 views
0

Я могу передать данные (authorID) для просмотра с помощью DidSelectRowAtIndexPath. Теперь я пытаюсь выполнить один и тот же сеанс с кнопкой IBACTION, но я не смог найти способ ее выполнить. Я не мог найти способ использовать NSIndexPath внутри INACTION.Swift - Как выполняет IBACTION segue

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     performSegueWithIdentifier("ArticleSegue", sender: indexPath) 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "ArticleSegue"{ 
      let toView = segue.destinationViewController as! ArticleTableViewController 
      let indexPath = sender as! NSIndexPath 
      let authorid = articleList?[indexPath.row]["author_id"].int! 
      toView.authorid = authorid    
} 

@IBAction func favButtonDidTouch(sender: AnyObject) { 
//??? 
} 
+0

Итак, у каждой строки вашего стола есть favButton? Используете ли вы пользовательские ячейки? – florianpfisterer

+0

да, у меня есть пользовательская ячейка, и каждая строка имеет favButton –

ответ

1

Одним из способов вы можете решить, как вам нужны просто строка ячейки (здесь indexPath.row для вашего articleList), чтобы дать вашему favButtons тега (если вы не используете UIView- теги для чего-то еще).

Это означает, что при настройке ячейки в tableView:cellForRowAtIndexPath: вы просто говорите:

cell.favButton.tag = indexPath.row 

затем в вашем IBAction, создать NSIndexPath с этой меткой и вызовите SEGUE:

let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) 
self.performSegueWithIdentifier("ManualSegue", sender: indexPath) 

Убедитесь в том, отправителем в этом случае является UIView (здесь UIButton).

+0

Как я собираюсь назвать это в prepareForSegue? Я получил ошибку для «let indexPath = sender as! NSIndexPath» внутри проверки if. Ошибка: «Не удалось передать значение типа« UIButton »(0x111798f68) в« NSIndexPath »(0x10f670680)« –

+0

, тогда вы, вероятно, настроили segue на favButton в вашей раскадровке. Проверьте, выделен ли favButton, если вы нажмете на сегмент в раскадровке. Если это так, удалите segue и создайте новый ручной режим, щелкнув «Send» viewcontroller и перетащите управление в целевой контроллер просмотра вашего сеанса. – florianpfisterer

+0

Спасибо, это исправлено ... –

1

Если вы определили SEGUE как ручной Segue между двумя контроллерами зрения, вы можете просто позвонить

performSegueWithIdentifier("ManualSegue", sender: self) 

Другая возможность заключается в том, что вы определяете SEGUE от самой кнопки на целевой контроллер вида , В этом случае это происходит автоматически; вам не нужно ни IBAction, ни звонок performSegueWithIdentifier.

0

есть способ его

performSegueWithIdentifier("ArticleSegue", sender:self) 
+0

Я не могу этого сделать, потому что каждая строка имеет идентификатор uniq, который мне нужно передать с помощью segue –

0

Назначают в теге UIButton в вашем

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    // Setup cell etc.. 
    .... 
    cell.favButton.tag = indexPath.row 
    ... 
    return cell 
} 

Тогда в вашем методе действия, обратите внимание на изменения в методе от AnyObject к UIButton! поэтому вы можете получить доступ к свойству тега.

@IBAction func favButtonDidTouch(sender: UIButton!) { 
    performSegueWithIdentifier("ArticleSegue", sender:NSIndexPath(forRow: sender.tag, inSection: 0)) 
} 
+0

Как мне нужно вызвать «indexPath» внутри prepareForSegue? –

+0

Вы называете это так же, как и раньше, поскольку вы передаете объект 'NSIndexPath' так же, как вы в' didSelectRowAtIndexPath', в сообщении об ошибке, которое вы отправили, кажется, что вы передаете 'UIButton', который является неправильным. – sbarow

Смежные вопросы