0

我有一个父 ViewController (SearchViewController),它连接到一个 TableViewController (FilterTableViewController),用户可以在 TableView 中选择人员。选择存储在一个名为 selectedpersonArray 的 NSMutableArray 中,它已经可以正常工作了。但现在我需要将它们传递回父 ViewController。我试图实现一个协议/委托。由于我是 Objective-C 的新手,我无法正确理解某些部分并且它不起作用:

FilterTableViewController.h(子控制器)

@protocol filterDelegate <NSObject>
-(void)addArraytoSearchViewController:(NSMutableArray *)array;
@end

@interface FilterTableViewController : UITableViewController

@property (nonatomic, assign) id <filterDelegate> selectedpersonDelegate;


@property (nonatomic, retain) NSMutableArray *selectedpersonArray;    

@end

过滤表视图控制器.m

#import "FilterTableViewController.h"

@interface FilterTableViewController ()
@end

@implementation FilterTableViewController

...

@synthesize selectedpersonArray;
@synthesize selectedpersonDelegate;

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

[[self selectedpersonDelegate] addArraytoSearchViewController:selectedpersonArray];
NSLog(@"personarray: %@", selectedpersonDelegate);
}

问题 1:我可以在 NSLog 中显示代理吗?这里它返回 nil,但 selectedpersonArray 包含值。问题 2:有没有比 didSelectRowAtIndexPath 更好的传递 Array 的地方,因为可以进行多个选择,并且只有在按下 Back 按钮时才能传递 Array。我可以使用 *- (void)prepareForSegue:(UIStoryboardSegue )segue sender:(id)sender吗?

SearchViewController.h:(父视图)

#import "FilterTableViewController.h"

@interface SearchViewController: UIViewController <UITableViewDataSource, UITableViewDelegate, filterDelegate>

SearchViewController.m:

@implementation SearchViewController

...

- (void)viewDidLoad{
    FilterTableViewController * FTC = [[FilterTableViewController alloc] init];
    FTC.delegate = self;

- (void)addArraytoSearchViewController:(NSMutableArray *)array {
    NSLog(@"%@", array);
}

问题 3: NSLog 在这里没有做任何事情......怎么了?问题 4:如何从第二个 ViewController 传递多个 Array?

提前致谢!

4

2 回答 2

0

我忘了设置委托,因为用户 firoze 想通了。这解决了我的问题

于 2013-05-13T22:03:50.037 回答
0

所以听起来好像您实际上并没有在 segue 为您呈现的 FilterTableViewController 上设置委托。只需在您的方法中设置委托,您prepareForSegue:sender:显然也在推送其他数据。

现在,在您的-[SearchViewController viewDidLoad]方法中,您正在创建另一个名为 FTC 的实例,设置它的委托,然后立即丢弃该 FTC 实例。该实例与将由 segue 推送的实例无关。

关于你的其他问题:

1.) 是的,您应该可以在那里看到代表。

2.) 是的,如果您想收集多个选择,那么在选择完成时通知您的代表可能更有意义。

3.) 可能永远不会调用此方法,因为您从未正确设置委托。

4.) 如果你有两个数组,你可能只在你的委托方法中包含两个参数。如果超过 2 个,我会考虑一个数组字典,或者一个数组数组。

希望有帮助。

于 2013-02-11T00:44:33.697 回答