1

モーダルセグエで aを提示できるViewController1with aがあります。からアクセスする必要があるため、収集したテキストを設定できます。UILabelViewController2UITextFieldViewController2ViewController1UILabel

私はprepareForSegue成功せずに作業しようとしました。私は何をすべきか?

編集:

デリゲートを使用していますが、何か間違っています。で使用しているコードは次のViewController2.hとおりです。

@class ViewController2;

@protocol VCProtocol

-(void)setName:(NSString *)name;

@end

@interface ViewController2 : UIViewController

@property (nonatomic, weak) id<VCProtocol> delegate;
@property (strong, nonatomic) IBOutlet UITextField *nameField;

- (IBAction)setButton:(id)sender

@end

ViewController2.m

-(IBAction)setButton:(id)sender
{
    [self.delegate setName:nameField.text];
}

私はに準拠しVCProtocolていViewController1.hます。次に、私ViewController1.mの には、次のコードがあります。

- (void)setName:(NSString *)name
{
    self.firstSignatureNameLabel.text = name;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqual:@"Sign"])
    {
        ViewController2 *VC = [segue destinationViewController];
        VC.delegate = self;
    }
}
4

2 に答える 2

0

プロトコルを作成し、 VC1 を VC2 のデリゲートとして設定しprepareForSegue、VC1 を VC2 のデリゲートとして設定するために使用することができます。うまくいかなかったとあなたが言ったことは知っていますが、その理由がわかりません。これを試してください:

セグエ (ストーリーボード上) に識別子を付け、prepareForSegue以下に示すように実装します。

VC2Delegate.h :

@protocol VC2Delegate
    - (void)updateLabel:(NSString *)text;
@end

VC1.h:

#import "VC2Delegate.h"
@interface VC1 : UIViewController <VC2Delegate>
    // All your stuff
@end

VC1.m:

- (void)updateLabel:(NSString *)text {
    [_label setText:text];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"YourSegueIdentifier"]) {
        VC2 * vc = [segue destinationViewController];
        [vc2 setDelegate:self];
    }
}

VC2.h:

#import "VC2Delegate.h"
@interface VC2 : UIViewController
    @property (weak, nonatomic) id<VC2Delegate>delegate;
@end

VC2.m

- (void)textWasUpdated { // or whatever method where you detect the text has been changed
    if (_delegate)
        [_delegate updateLabel:[_textView text]];
}

それが機能するかどうか教えてください。そうでなければ、 prepareForSegue が呼び出されていますか?

編集:私の答えを更新しました(正確にはあなたが必要としていたものではありませんでした)。しかし、あなたが言うように、それは機能しません:

  • prepareForSegue は呼び出されていますか?
  • もしそうなら、デリゲートメソッドは呼び出されていますか?
  • デリゲート メソッドが呼び出されていない場合は、デリゲートが ではないことを確認しnilます。

セグエを削除しpresentViewController:animated:completion:、次のように を使用して、自分でモーダルに表示することをお勧めします。

- (IBAction)buttonWasTapped {
    static NSString * const idModalView = @"modalView";
    static NSString * const storyBoardName = @"MainStoryBoard"
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyBoardName bundle:nil];
    VC2 * vc = [storyboard instantiateViewControllerWithIdentifier:idModalView];
    [vc setDelegate:self];
    [self.navigationController presentViewController:vc2 animated:YES completion:nil];
}
于 2013-08-10T06:04:01.677 に答える
-2

この問題に遭遇したとき、シングルトンアプローチを選択しましたが、うまくいきました。

于 2013-08-10T02:28:35.490 に答える