私も同じ問題を抱えていました...たくさんのチュートリアルや本を読みました。これが私のために働いたものです。2つの方法が混在しており、おそらく1つだけが必要です。しかし、少なくとも私はそれを理解していて、簡単に使用できます。メソッドは委任であり、シングルトンを使用してグローバル変数を保持します。
コードをWordに貼り付け、適用されなかったものを削除し、必要なものはすべて残したと思います。
まず、新しいクラスファイルを作成します。鉱山はOptionsSingletonと呼ばれています。これにより、OptionsSingleton.hとOptionsSingleton.mが得られます。鉱山にはさらに多くの変数がありますが、これがあなたに当てはまるものです:
OptionsSingleton.h
@interface OptionsSingleton : NSObject{
int gblRowPicked;
}
@property(nonatomic) int gblRowPicked;
+(OptionsSingleton *) singleObj;
@end
OptionsSingleton.m
#import "OptionsSingleton.h"
@implementation OptionsSingleton
{
OptionsSingleton * anotherSingle;
}
@synthesize gblRowPicked;
+(OptionsSingleton *)singleObj{
static OptionsSingleton * single=nil;
@synchronized(self)
{
if(!single)
{
single = [[OptionsSingleton alloc] init];
}
}
return single;
}
@end
シングルトンの存在について伝えると、他のすべてのビューコントローラーはgblRowPickedを見ることができます。
// ViewControllerThatCallsTheTableViewController.h
#import <UIKit/UIKit.h>
#import "OptionsSingleton.h"
@interface ViewControllerThatCallsTheTableViewController.h : UIViewController
{
OptionsSingleton *optionsSingle;
}
と...
// ViewControllerThatCallsTheTableViewController.m
#import "ViewControllerThatCallsTheTableViewController.h"
#import "OptionsSingleton.h"
@interface ViewControllerThatCallsTheTableViewController ()
@end
@implementation ViewControllerThatCallsTheTableViewController
- (void)viewDidLoad
{
optionsSingle = [OptionsSingleton singleObj];
[super viewDidLoad];
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"PickFromTable"]){
TableViewController *viewController = segue.destinationViewController;
viewController.delegate = self;
}
}
-(void)done{
[self dismissViewControllerAnimated:YES completion: nil];
NSLog (@"Back in ViewControllerThatCallsTableViewController, Row picked is %i",optionsSingle.gblGamePicked);
}
セグエ識別子は、セグエをクリックしてプロパティインスペクターで名前を付けることにより、ストーリーボードに入力されました。doneメソッドは、閉じるときにTableViewControllerによって呼び出されます。ここで言うのは、元のビューコントローラが行を認識していることを証明するための行の値だけです。コードはそこから取得します(必要に応じて、行のデータを渡すことができます...そのための適切なグローバル変数を宣言する必要があります)。
TableViewControllerファイルには次のものが含まれています。
// TableViewController.h
@protocol ViewControllerThatCallsTheTableViewControllerDelegate <NSObject>
-(void) done;
@end
@interface TableViewController
プロトコルは、「done」メソッドがTableViewController自体ではなく、元のViewControllerにあることをTableViewControllerに通知します。
// TableViewController.m
#import "TableViewController.h"
#import "BeginningCell.h" // used for the prototype cell
#import "OptionsSingleton.h"
@interface TableViewController ()
@end
@implementation TableViewController
- (void)viewDidLoad
{
optionsSingle = [OptionsSingleton singleObj];
//other stuff: arrays for filling the table, etc.
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
optionsSingle.gblRowPicked=indexPath.row+1;
[self.delegate done];
}
そこに行きます...あなたの状況に当てはまる私の作業プログラムのすべてのコードを見つけたと思います。何も省略してすみません。
-ロブ