我有一个效果列表在表格视图中。我创建了一个位于右上方的按钮,可进行推送转场到另一个视图控制器,帮助创建新的效果。现在我想添加推送转场到表格视图单元格,这样可以在添加效果视图控制器上加载效果值,并且我可以保存编辑后的值。
问题是我能否通过编程方式创建推送转场?如果不行,我是否可以通过 prepareforsegue
传递效果?如果我尝试使用 prepareforsegue
,我会遇到一个问题,即从 UITableView
控制拖动无法让我创建推送转场至添加效果视图控制器。
我有一个效果列表在表格视图中。我创建了一个位于右上方的按钮,可进行推送转场到另一个视图控制器,帮助创建新的效果。现在我想添加推送转场到表格视图单元格,这样可以在添加效果视图控制器上加载效果值,并且我可以保存编辑后的值。
问题是我能否通过编程方式创建推送转场?如果不行,我是否可以通过 prepareforsegue
传递效果?如果我尝试使用 prepareforsegue
,我会遇到一个问题,即从 UITableView
控制拖动无法让我创建推送转场至添加效果视图控制器。
控制 拖动从视图控制器到视图控制器
您需要为segue指定标识符:
执行segue:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"yourSegue" sender:self];
}
现在问题来了,这只会执行跳转,如果你需要向那个视图控制器传递一些数据,则必须实现以下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
}
}
performSegue
函数中? - CDM social medias in bioNSIndexPath
来实现。 - meda本答案展示了如何传递数据,并针对 Xcode 8 和 Swift 3 进行了更新。
以下是如何设置项目:
TableView
的项目。这里提供一个简单的示例:点击此处。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)
}
}
如果想查看有关在视图控制器之间传递数据的基本示例,请参阅此答案。
编辑器 > 嵌入 > 导航控制器
。 - Houman这里还有另一种选项,不需要使用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
}
}
}
-(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];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (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;
}
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
,像这样:yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];
[self.navigationController YourViewController animated:YES];
通过这种方式,您可以在选择UITableViewCell
时实现推送转场。
希望这可以帮助到您...!
Swift 3
在跟进Ahmed Daou的答案之后,可以在Storyboard中手动从VC到VC拖动Segue。
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
}
}