Реализация делегата, позволяющего модальному представлению передавать данные обратно в UIViewController - PullRequest
1 голос
/ 02 января 2012

Я пытаюсь реализовать делегат, чтобы позволить модальному представлению передавать данные обратно в UIViewController.

У меня есть два контроллера представления, мой основной UIViewController и модальный. Используя приведенный ниже код, [делегат translationTextEntered: @ "Test"]; не влияет на главный экран (то есть «translationTextEntered» никогда не вызывается)

Мой главный контроллер

Содержит метод, вызываемый, когда модальное значение имеет значение пользователя:

MainViewController.h

- (void)translationTextEntered:(NSString *)txt;

MainViewController.m

- (void)translationTextEntered:(NSString *)text
{
    [self dismissModalViewControllerAnimated:YES];
    _text.text = [NSString stringWithFormat:@"%@" , text];
}

Мой модальный контроллер

Содержит UITableView, который содержит делегата и, когда элемент выбран, должен вызывать обратный вызов делегата.

SuggestionViewController.h

@protocol SelectTranslationDelegate <NSObject>
- (void)translationTextEntered:(NSString *)text;
@end

@interface SuggestionViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, SelectTranslationDelegate>
{
    id<SelectTranslationDelegate> delegate;
}

@property (nonatomic, weak)id delegate;

SuggestionViewController.h

@synthesize delegate = _delegate;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     ...      
    [delegate translationTextEntered:@"f"];

}

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Это должно быть примерно так:

MainViewController.h

#import "SuggestionViewController.h"

@interface MainViewController : UIViewController <SelectTranslationDelegate>

// - (void)translationTextEntered:(NSString *)txt;  <- Not required

Объявление - (void)translationTextEntered:(NSString *)txt; не требуется, поскольку вы говорите, что соответствуетепротокол SelectTranslationDelegate (бит между < / >)

MainViewController.m

// The method where you instantiate SuggestionViewController
{
     // .. do your work

     SuggestionViewController *suggestionViewController = [[SuggestionViewController alloc] init];

     suggestionViewController.delegate = self; // <- This is the missing line

     [self presentModalViewController:suggestionViewController animated:YES];
     // [suggestionViewController release]; suggestionViewController = nil; // I'm assuming your using ARC

}

Следует также отметить, что ваш модальныйКонтроллер вида не должен соответствовать SelectTranslationDelegate, так как это скорее всего не ваше намерение.Таким образом, ваша декларация должна выглядеть следующим образом:

@interface SuggestionViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

Это MainViewController, что вы хотите ответить на translationTextEntered:, а не SuggestionViewController.SuggestionViewController - это тот, который вызывает сообщение translationTextEntered: на delegate

0 голосов
/ 02 января 2012

В вашем контроллере модального представления в viewDidLoad или View WillAppear Включите предложение ...

  1. Создайте объект вашего главного контроллера вида ... в представлении DidLoad ...

    mainViewController * mainVC = [[mainViewController alloc] initwithnobname]; ...

  2. Затем установите предложение

    self.delegate = mainVC;

Это то, что вам нужно сделать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...