无法识别的选择器,委托问题

时间:2012-01-15 20:29:26

标签: iphone ios delegates

我收到此错误

  

[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并将委托信息传递给该视图但是这样做我收到此错误...我想知道是否必须在视图1中为视图3设置委托传递信息......是正确的吗?

如果是这样,在设置委托时我需要考虑什么?如何从视图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 个答案:

答案 0 :(得分:1)

因此,从我所知道的,将信息存储到文件中,然后在需要时将其恢复原状可能是实现您想要的更简单的方法。像这样的东西(我知道,过度简化):

- (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

通过这些方式,您可以在视图控制器之间传递信息。祝你好运!