我在表格视图中有一个效果列表。我创建了一个右上角的条形按钮,它可以将push segue推送到另一个视图控制器,这有助于创建一个新的效果。现在我想将push segue添加到表格视图单元格中,以便可以在添加效果视图控制器上加载效果值,我可以保存已编辑的值。
问题是我可以通过编程方式创建push segue吗?如果没有,我可以通过prepareforsegue
传递效果吗?如果我尝试使用prepareforsegue
,我遇到一个问题,即从UITableView
拖动控件不会让我创建一个推送到添加效果视图控制器的位置。
答案 0 :(得分:175)
control 从View Controller拖动到View Controller
您需要为您的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
}
}
答案 1 :(得分:45)
这个答案显示了如何传递数据,并针对Xcode 8和Swift 3进行了更新。
以下是如何设置项目。
TableView
创建项目。有关简单示例,请参阅here。ViewController
。使用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)
}
}
有关在视图控制器之间传递数据的更基本示例,请参阅this answer。
答案 2 :(得分:44)
这是另一个选项,不需要使用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
}
}
}
答案 3 :(得分:13)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
答案 4 :(得分:5)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
[self.navigationController pushViewController:myVController animated:YES];
}
答案 5 :(得分:3)
你有2个选项:ctrl +从原型单元格拖动到新的vc,然后你将从每个单元格中删除,你必须实现为segue做准备。
第二个选项,在didselectrowatindexpath中你可以使用self.storyboard instantiateviewcontrollerwithidentifier ...来实例化你的新viewcontroller,然后调用pushviewcontroller或presentviewcontroller,在这个场景中你不需要故事板中的segue或准备segue。
答案 6 :(得分:2)
您可以使用此方法:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
您可以在此处执行选择特定tableview单元格的功能。
答案 7 :(得分:0)
您可以通过以下方法执行此操作:
首先,您需要在当前视图中导入另一个视图控制器。
- (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];
通过这个,你可以在选择UITableViewCell
时实现推送segue。
希望这可以帮助你......!
答案 8 :(得分:0)
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
}
}
答案 9 :(得分:0)
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
NSIndexPath *indexPath = (NSIndexPath *)sender;
}
}