テーブルビューにエフェクトのリストがあります。新しいエフェクトを作成するのに役立つ別のView Controllerにセグエをプッシュする右上のバーボタンを作成しました。次に、テーブルビューのセルにプッシュセグエを追加して、エフェクト値がエフェクトビューの追加コントローラーに読み込まれるようにし、編集した値を保存できるようにします。
問題は、プログラムでプッシュセグエを作成できますか?そうでない場合、prepareforsegue
を介してエフェクトを渡すことができますか? prepareforsegue
を使用しようとすると、UITableView
からコントロールをドラッグしても、エフェクトビューコントローラーの追加にプッシュセグエを作成できないという問題が発生します。
control View ControllerからView Controllerにドラッグします
セグエに識別子を与える必要があります:
セグエを実行します。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"yourSegue" sender:self];
}
ここに問題があります。ViewControllerにデータを渡す必要がある場合、これはセグエを実行するだけです。次に、次のセグエ委任を実装する必要があります。
- (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
}
}
この回答はデータの受け渡し方法を示しており、Xcode 8およびSwift 3用に更新されています。
プロジェクトのセットアップ方法は次のとおりです。
TableView
を使用してプロジェクトを作成します。簡単な例については、 here をご覧ください。ViewController
を追加します。TableViewを備えた最初のView Controller:
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間でデータを渡すことに関するより基本的な例については、 this answer を参照してください。
DidSelectRowAtIndexPathの使用を必要としない別のオプションを次に示します。
Interface Builderでプロトタイプセルから宛先にセグエを接続するだけです。
そこから簡単に次のことができます。
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];
}
次の2つのオプションがあります。ctrl+プロトタイプセルから新しいvcにドラッグしてから、各セルからセグエを実行し、セグエの準備を実装する必要があります。
2番目のオプション、didselectrowatindexpathでは、self.storyboard instantiateviewcontrollerwithidentifier ...を使用して新しいViewControllerをインスタンス化してから、pushviewcontrollerまたはpresentviewcontrollerを呼び出します。
このメソッドを使用できます:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
これで特定のTableViewセルを選択する機能を実行できます。
Swift
Ahmed Daouの回答をフォローアップした後、ストーリーボードで手動で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
}
}
- (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;
}
}
これは、次の方法で実行できます。
まず、現在のビューに別のView Controllerをインポートする必要があります。
- (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
が選択されているときにプッシュセグエを実現できます。
これがあなたに役立つことを願っています...!