2015-05-31 2 views
2

Я прошел через большинство предыдущих связанных сообщений, но хотя я правильно их соблюдал (насколько я понял), я просто не могу вызвать метод делегата для кода ниже ,Пользовательский делегат с модальным листом формы не работает

Цель: ModalView генерирует строку *SQL_String. Нажмите DONE, чтобы закрыть ModalView и вызвать метод делегата в родительском представлении, чтобы получить это значение *SQL_String.

SearchModalViewController.h

@protocol SearchControllerDelegate 
- (void)didDismissModalView:(NSString *)SQL_String; 
@end 

@interface SearchModalViewController : UIViewController 
@property (nonatomic, assign) id <SearchControllerDelegate> searchDelegate; 
- (IBAction)handleDone:(id)sender; 

SearchModalViewController.m

@interface SearchModalViewController() 
@end 

@implementation SearchModalViewController 
@synthesize searchDelegate; 

- (IBAction)handleDone:(id)sender { 
    [self dismissView:sender]; 
} 

- (void)dismissView:(id)sender { 
    [searchDelegate didDismissModalView:@"Test"]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

DetailViewController.m (Мой родительский View Controller)

@interface DetailViewController() <SearchControllerDelegate> 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    SearchModalViewController *searchModal = [[SearchModalViewController alloc] init]; 
    searchModal.searchDelegate = self; 
} 

ПРОБЛЕМА:

Ниже метод делегата не получает сигнал.

- (void)didDismissModalView:(NSString *)SQL_String { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    NSLog(@"The string = %@", SQL_String); 
} 

Любая идея, где я делаю неправильно?

EDIT: Спасибо, ребята. С вашими быстрыми предложениями я могу закрыть его, добавив ниже код вместо моего предыдущего соединения IB.

- (IBAction)showSearchModal:(id)sender { 
    SearchModalViewController *searchModal = [self.storyboard instantiateViewControllerWithIdentifier:@"search"]; 
    searchModal.searchDelegate = self; 
    searchModal.modalPresentationStyle = UIModalPresentationFormSheet; 
    searchModal.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentViewController:searchModal animated:YES completion:nil]; 
} 
+0

Можете ли вы показать код, в котором вы представляете «SearchModalViewController»? почему вы создаете его локально внутри 'viewDidLoad'? не исчезает ли этот экземпляр после возвращения 'viewDidLoad'? – nburk

+0

@nburk, я попытался изменить его ниже, но делегат до нуля. property (strong) SearchModalViewController * SearchModal; или интерфейс DetailViewController: UIViewController { SearchModalViewController * SearchModal; } – anuj

+0

ok, пожалуйста, покажите код, в котором вы называете 'presentViewContrller:'. и еще одно: пожалуйста, обновите свой вопрос кодом, а не помещайте его в комментарии :) – nburk

ответ

1

Вот он идет

Change DetailViewController.m

- (IBAction)pushToSearch:(id)sender{ 
    SearchModalViewController *searchModal = [self.storyboard instantiateViewControllerWithIdentifier:@"search"]; 
    searchModal.searchDelegate = self; 
    [self presentViewController:searchModal animated:YES completion:nil]; 
} 

И это будет работать.

+0

большое спасибо. Ваша помощь указала мне в правильном направлении. Мне пришлось отключить соединение с моим modalview от IB и связать его программно, как вы рекомендовали. Это сработало. Stackoverflow пород. – anuj

1

Вам необходимо установить делегат при представлении SearchModalViewController. Причина, по которой ваш код в настоящее время не работает, заключается в том, что делегат диспетчера модального представления равен нулю.

Update:

Вы устанавливаете делегата prepareForSegue:sender:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)__unused sender 
{ 
    if ([[segue identifier] isEqualToString:@"modalSearch"]) 
    { 
     SearchModalViewController *controller = (SearchModalViewController *)[segue destinationViewController]; 
     controller.delegate = self; 
    } 
} 
+0

Да, searchdelegate - это нуль в моем случае. Я представил SearchModalViewController через IB без какого-либо кода. Перетащил baritem ПОИСК из detailviewcontroller в этот ModalView как Segue: Модальный, Презентация: Лист формы и Транзиция: Крест Растворяется. В этом случае вы можете указать, как/где я могу установить делегат при представлении этого модального представления? – anuj

+0

благодарит много христиан. Ваша помощь также указала мне на правильное направление. Я изменил код на тот, что был рекомендован шивамом, и он сработал. – anuj

+0

Нет проблем! Способ, которым я показал, связан с IB-соединением, но вы также можете делать это программно. В любом случае, делегат становится установленным сейчас :) –

1

Во-первых, убедитесь, что ваш dismissView: в SearchModalViewController становится срабатывает.

Во-вторых, убедитесь, что ваш searchDelegate в методе dismissView: не nil.

Смежные вопросы