6

私はFirstViewControllerとを持っていSecondViewControllerます。FirstViewControllerにモーダルでセグエを実行するためのボタンを作成しましたSecondViewController

私は 8 項目のリストを表示する tableView を持っています。SecondViewControllerそのリストから項目を選択すると、IdismissViewControllerAnimated:に戻りFirstViewControllerます。

私がやりたいことは、文字列をに戻すことFirstViewControllerです。

この投稿をコードのリファレンスとして使用しました: dismissModalViewController AND pass data back

これは私が持っているものです:

FirstViewController.h で

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "SecondViewController.h"

@interface FirstViewController : UIViewController <SecondDelegate>

@end

FirstViewController.m 内

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

...

- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{    
    NSString *theString = stringForFirst;
    NSLog(@"String received at FirstVC: %@",theString);
}

@end

SecondViewController.h で

#import <UIKit/UIKit.h>

@protocol SecondDelegate <NSObject>
-(void) secondViewControllerDismissed:(NSString *)stringForFirst;
@end

@interface SecondViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>
{
    __weak id myDelegate;
}

@property (nonatomic, weak) id<SecondDelegate> myDelegate;
@property (weak, nonatomic) IBOutlet UITableView *myTableView;

@end

SecondViewController.m で

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

@synthesize myDelegate;
@synthesize myTableView;

...

- (int)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 8;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [atributoTableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
    }

    cell.textLabel.text = //strings from an array here;    
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
    {
        [self.myDelegate secondViewControllerDismissed:@"SOME STRING HERE"];
        NSLog(@"string passed");
    }

    [self dismissViewControllerAnimated:YES completion:nil];
    NSLog(@"SecondViewController dismissed");
}

@end

アプリを実行すると からFirstViewControllerに移動できSecondViewController、tableView から行を選択すると正常に戻りFirstViewControllerます。問題は、文字列「SOME STRING HERE」が返されなかったことです。

私は何が欠けていますか?

ところで、これが関連しているかどうかはわかりません: 私は ARC とストーリーボードを使用しています。

4

2 に答える 2

4

2番目のViewControllerを提示するとき、つまりFirstViewControllerでデリゲートを設定する必要があります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     if ([segue.identifier isEqualToString:@"present_secondviewcontroller]) {
          SecondViewController *svc = (SecondViewController *)segue.destinationViewController;
          svc.delegate = self;
     }
}
于 2013-03-08T20:19:19.780 に答える