【发布时间】: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 中调用委托方法。但是它似乎引起了问题。当我从一个视图传递到另一个视图时,我做得很好,但似乎无法让这个双重弹出动作起作用......