如何在selectUITableViewCell时进行推送
我有一个表视图中的效果列表。 我已经创build了一个右上angular的button,它可以推到另一个视图控制器,这有助于创build一个新的效果。 现在,我想将push segues添加到表格视图单元格,以便可以将效果值加载到添加效果视图控制器上,并且可以保存编辑的值。
问题是我可以通过编程创build一个push segue吗? 如果不是的话,我可以通过一个prepareforsegue
来传递效果吗? 如果我尝试使用prepareforsegue
,我遇到了一个问题,从UITableView
控件拖放不会让我创build一个推继续添加效果视图控制器。
控制拖动从视图控制器到视图控制器
你将需要给你的segue一个标识符:
执行segue:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"yourSegue" sender:self]; }
现在这里是事情,如果你需要传递一些数据到视图控制器,这将只执行segue。 那么你必须执行下面的segue委托:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Make sure your segue name in storyboard is the same as this line if ([[segue identifier] isEqualToString:@"yourSegue"]) { //if you need to pass data to the next controller do it here } }
这是另一个选项,不需要使用didSelectRowAtIndexPath。
您只需将Interface Builder中的segue从原型单元连接到目标。
从那里你可以简单地:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "AffiliationDetail", let destination = segue.destinationViewController as? AffiliateDetailViewController { if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) { var affiliation = affiliations[indexPath.row] destination.affiliation = affiliation } } }
迅速
这个答案显示了如何传递数据,并更新为Xcode 8和Swift 3。
这是如何设置项目。
- 使用
TableView
创build一个项目。 这里看一个简单的例子。 - 添加第二个
ViewController
。 - 使用表视图控制从第一个视图控制器拖到第二个视图控制器。 select“显示”作为seguetypes。
- 单击故事板中的segue,然后在Attribute Inspector中标识标识符“yourSegue”。 (你可以任意调用它,但是你也需要在代码中使用相同的名字。)
- (可选)通过select故事板中的第一个视图控制器并转到编辑器>embedded>导航控制器,可以将所有内容embedded到导航控制器中 。
码
具有TableView的第一个视图控制器:
import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // ... // method to run when table view cell is tapped func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // Segue to the second view controller self.performSegue(withIdentifier: "yourSegue", sender: self) } // This function is called before the segue override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // get a reference to the second view controller let secondViewController = segue.destination as! SecondViewController // set a variable in the second view controller with the data to pass secondViewController.receivedData = "hello" } }
第二视图控制器
class SecondViewController: UIViewController { @IBOutlet weak var label: UILabel! // This variable will hold the data being passed from the First View Controller var receivedData = "" override func viewDidLoad() { super.viewDidLoad() print(receivedData) } }
有关在View Controller之间传递数据的更基本示例,请参阅此答案 。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"YourPushSegueName" sender:self]; }
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"]; [self.navigationController pushViewController:myVController animated:YES]; }
你有2个select:ctrl +从原型单元格拖动到新的vc,然后你将从每个单元格继续,你必须实现准备for segue。
第二个选项,在didselectrowatindexpath中,您可以使用self.storyboard instantiateviewcontroller withidentifier …实例化您的新viewcontroller,然后调用pushviewcontroller或presentviewcontroller,在这种情况下,您不需要在storyboard中进行segues或准备segue。
你可以使用这个方法:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
你可以在这里select一个特定的tableview单元格来执行一个function。
你可以通过以下方法来做到这一点:
首先,您需要在当前视图中导入另一个视图控制器。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}
在上面的方法里面你必须调用一个方法- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
喜欢这个:
yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil]; [self.navigationController YourViewController animated:YES];
通过这个,你可以在selectUITableViewCell
时候实现push segue。
希望这可以帮助你…!
Swift 3
在跟随了Ahmed Daou的回答之后 – >手动将segue从vc拖到故事板上的vc
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "SegueIdentifier", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "SegueIdentifier" { //do something you want } }