Делегат не работает должным образом - PullRequest
2 голосов
/ 09 января 2012

Я пытаюсь передать некоторую информацию между подпредставлением и родительским просмотром в стеке навигации с помощью делегатов.

Однако по какой-то причине, когда я выполняю делегат из подпредставления, а затем извлекаю подпредставление из навигационного контроллера, он никогда не входит в метод делегата, настроенный в родительском представлении. Я пробовал NSLogs & Breakpoints, поток вызывающе не делаю этого метода делегата на главном экране, поэтому я надеялся, что вы мне поможете.

Прежде всего я покажу вам, как я настроил своего делегата, где я называю его в своем подпредставлении, а затем, где я настроил его в главном окне, надеюсь, вы, ребята, сможете увидеть то, что у меня не так далеко.

Subview.h // Я пропустил вещи, не связанные с делегатом

#import <UIKit/UIKit.h>

//Delegate - Protocol stuff for passing data from this view to the parent view
@protocol PassSearchData <NSObject>
@required
- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath;
@end

@interface SecondViewController : UITableViewController <UITableViewDataSource> {
//Delegate (Used to pass information back to parent view)
    id <PassSearchData> delegate;
}
//Delegate (Used to pass information back to parent view)
@property (strong) id delegate;
@end

SecondView.m

#import "SecondViewController.h"
#import "FirstViewController.h"

@implementation SecondViewController

//..

//Delegate (Used to pass information back to parent view)
@synthesize delegate;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    //Access selected cells content (cell.textLabel.text)
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    //Parent view logic (sends info back to the correct cell in parent view)
    if (parentViewSelectedIndexPath.section == 0) 
    {
        if (parentViewSelectedIndexPath.row == 0) 
        {
            //Predicates restrict the values that will be returned from the query
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text];
            filterArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

            [[self delegate]setManufactureSearchFields:filterArray withIndexPath:indexPath]; 

//            NSLog(@"Filtered Array = %@", filterArray);
        }
    }
   [self.navigationController popViewControllerAnimated:YES]; //pops current view from the navigatoin stack

}//...

Тогда вот как я настроил это в FirstViewController

FirstViewController.h

#import <UIKit/UIKit.h>
#import "VehicleResultViewController.h" //With this included I can now use the PassSearchData delegates of this view for passing data

@interface VehicleSearchViewController : UITableViewController <PassSearchData> {
//..

FirstViewController.m

#import "VehicleSearchViewController.h"
#import "VehicleResultViewController.h" //Subview

//..

#pragma mark - Received data from Sub view delegates

//These are the delegate method for passing data from the child to the parent view (parent being this view, with the delegate being declared in the subview)

- (void) setManufactureSearchFields:(NSArray *)arrayValues withIndexPath:(NSIndexPath *)myIndexPath
{
    manufactureSearchObjectString = [[arrayValues valueForKey:@"MANUFACTURER"] objectAtIndex:0];
    manufactureIdString = [[arrayValues valueForKey:@"MANUFACTURERID"] objectAtIndex:0]; //Restricts Models dataset
    manufactureResultIndexPath = myIndexPath;
}

Если кто-нибудь знает, что я пропускаю / делаю неправильно, любая помощь будет действительно очень полезной

любые вопросы, дайте мне знать.

Решение

В контроллере firstview, когда я иду, чтобы загрузить второй контроллер viewview внутри tableView: didSelectRowAtIndexPath: я забыл установить делегат secondviewcontrollers, прежде чем выдвинул представление в стек навигации ... поэтому отсутствующий код был следующим.

FirstView.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Get the subview ready for use
        VehicleResultViewController *vehicleResultViewController = [[VehicleResultViewController alloc] initWithNibName:@"VehicleResultViewController" bundle:nil];

        //Pass the selected object to the new view controller.
        [self.navigationController pushViewController:vehicleResultViewController animated:YES];

        [vehicleResultViewController setDelegate:self];

//etc

спасибо, ребята.

Ответы [ 2 ]

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

Хорошо, во-первых, ваш делегат должен быть слабой ссылкой, чтобы избежать сохранения циклов.Но я подозреваю, что, возможно, делегат не настроен.Можете ли вы показать код, где создается экземпляр SecondViewController и установлен делегат?Можете ли вы установить точку останова при вызове делегата и убедиться, что это не ноль?

1 голос
/ 09 января 2012

Я думаю, вы не устанавливаете делегат. После создания Instanace (объекта) SecondViewController необходимо установить Delegate.

е

SecondViewController *secondObj=[[SecondViewController alloc]initWithNibName:@"SecondViewController"> bundle:nil];

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