Нераспознанный селектор, проблемы делегата - PullRequest
1 голос
/ 16 января 2012

Я получаю эту ошибку

[ResultViewController setSearchFields: IndexPath:]: нераспознанный селектор отправлен на экземпляр 0xc448840

У меня есть стек контроллера навигации, в котором я нахожусьиспользование делегатов для передачи информации в предыдущее представление в стеке навигации. Однако я думаю, что делаю что-то не так, когда объявляю делегата.

Мой стек навигации выглядит следующим образом.

view 0 (mainmenu)
-- view 1 (SearchViewController)
--- view 2 (ResultViewController) - where I set the delegate of the new view being loaded
---- View 3 (SubViewController) - this is where my delegates reside

Что я делаю, так это захожу в view1 и передаю информацию о делегате в это представление, но при этом я получаю эту ошибку ... Мне интересно, должен ли я установить делегата для представления 3 в представлении 1, где я заканчиваюдо передачи информации ... это правильно ??

Если так, о чем я должен думать при настройке делегата?Как мне вызвать это из представления 1

Вот так я настраиваю своего делегата в SubViewController

subvc.h

@protocol PassSubSearchData <NSObject>
@required
- (void) setSearchFields:(NSArray *)modArray IndexPath:(NSIndexPath *)modIndexPath;
@end

@interface VehicleSubResultViewController : UITableViewController <NSXMLParserDelegate> {
//..
 //Delegate for passing Mod and SubMod data back to VehicleSearchViewController
    id <PassSubSearchData> delegate;
//..
//Delegate for passing Mod and SubMod data back to VehicleSearchViewController
@property (strong) id delegate;

subvc.m

#pragma mark - Table view delegate

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

    //Predicates restrict the values that will be returned from the query.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"SUB",cell.textLabel.text];
    filterArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

    [[self delegate] setSearchFields:tempModArray IndexPath:tempModIndexPath];

    //This pops to the View 1 - SearchViewController
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

}

Тогда В моем SearchViewController так я настраиваю делегаты

searchvc.h

#import "SubViewController.h"

@interface SearchViewController : UITableViewController <PassSubSearchData> {
//..

searchvc.m

- (void) setSearchFields:(NSArray *)modArray IndexPath:(NSIndexPath *)modIndexPath
{
    modSearchObjectString = [[modArray valueForKey:@"MOD"] objectAtIndex:0];
    modSearchIndexPath = modIndexPath; // Sets the selected IndexPath from the subview


    NSLog(@"%@", modSearchObjectString);
    NSLog(@"%@", modResultIndexPath);



    [self.tableView reloadData]; 
}

Это в значительной степени подводит итог ... извините за задержку.

1 Ответ

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

Итак, из того, что я могу сказать, сохранение информации в файле и последующее ее восстановление при необходимости может быть более простым способом достижения того, что вы хотите. Что-то (я знаю, упрощенно), как это:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //store the cell's title into a string
    NSString* string = [[[tableView cellForRowAtIndexPath:indexPath] textLabel] text];

    [[NSUserDefaults standardUserDefaults] setObject:string forKey:@"someKey"];
}

Позже вы можете вернуть эту строку, используя:

NSString* titleString = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"];

Таким же образом вы можете продолжить работу с информацией, которую вам нужно передать.

Другой альтернативой является создание свойства в контроллере представления, получающего данные:

@property(nonatomic, retain) NSString* string; //you need to synthesize it in the .m file too

затем перед тем, как перейти к контроллеру вида:

//make sure you cast it
(SearchViewController*)[self.navigationController.viewControllers objectAtIndex:1].string = @"some string";

затем, как только вы перейдете к этому контроллеру, это свойство будет установлено с любой строкой, которую вы установили в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

И таким образом вы можете передавать информацию между контроллерами представления. Удачи!

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