1

我有一个ViewController1with aUILabel可以呈现一个ViewController2带 Modal Segue 的 a。我有一个我需要从中访问的UITextField内容,因此我可以使用收集的文本设置我的内容。ViewController2ViewController1UILabel

我已经尝试过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 的委托应该可以工作。我知道你说它不起作用,但我不明白为什么。试试这个:

给你的 segue 一个标识符(在故事板上),并按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.

您可能想要删除 segue,并使用 自己以模态方式呈现它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 回答