【问题标题】:Unrecognized selector, Delegate problems无法识别的选择器,委托问题
【发布时间】:2012-01-15 20:29:25
【问题描述】:

我收到了这个错误

[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]; 
}

总结得差不多了..抱歉耽搁了。

【问题讨论】:

  • 您能否发布带有相关方法声明的代码以及调用该方法的代码?
  • 我有点不清楚你想做什么。你真正需要的只是将数据从表视图传递到下一个视图控制器,就像 PopUp 说的那样?
  • 如果您查看我拥有的导航堆栈,我想将此委托从视图 3 传递到视图 1.. 但我认为这就是导致问题的原因,因为也许我正在声明委托在错误的地方还是什么?问题是我的应用程序中有另一个代表从子视图传递到主视图很好..但是复制所有代码然后尝试从子子视图传递到主视图导致问题...跨度>
  • 但是你为什么要通过委托?您可能会以错误的方式处理此问题。您在视图控制器 1 中使用了委托中的哪些信息?将关键信息存储在NSUserDefaults 中可能会更简单(因为需要出现 NSData),然后在下一个视图控制器中解压缩它。
  • 是的,我似乎迷失了方向。我使用协议和委托组合的原因是因为我已经阅读了它的苹果首选的做事方式。但是对于这个特殊的问题,我想从导航控制器中弹出视图 3 和视图 2,并在 View1 中调用委托方法。但是它似乎引起了问题。当我从一个视图传递到另一个视图时,我做得很好,但似乎无法让这个双重弹出动作起作用......

标签: iphone ios delegates


【解决方案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

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

【讨论】:

  • 好的,很酷的家伙,感谢您的帮助,我将尝试一下并进行一些研究,看看我的进展如何。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多