委托/协议不起作用:将TableViewController中的Array传递给父ViewController

时间:2013-02-05 22:53:19

标签: uiviewcontroller delegates nsmutablearray uitableview protocols

我有一个父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

FilterTableViewController.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更好的传递数组的地方,因为可以进行多项选择,只有在按下后退按钮时才能传递数组。我可以使用* - (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传递多个数组?

提前感谢!

2 个答案:

答案 0 :(得分:0)

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

现在,在您的-[SearchViewController viewDidLoad]方法中,您正在创建名为FTC的其他实例,设置其委托,然后立即抛弃该FTC实例。该实例与将被segue推动的实例无关。

关于你的其他问题:

1。)是的,您应该能够在那里看到代表。

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

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

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

希望有所帮助。

答案 1 :(得分:0)

我忘了将代表设置为用户firoze想通了。这解决了我的问题