0

我有一个父级的ViewController(SearchViewController),它可以继承TableViewController(FilterTableViewController),用户可以在TableView中选择人员。选择存储在名为selectedpersonArray的NSMutableArray中,该工作已经很好。但是现在我需要将它们传递回父ViewController。我试图实现一个协议/委托。由于我是新来的Objective-C,我不恰当地理解一些地方,这是行不通的:委托/协议不起作用:将数组从TableViewController传递给父ViewController

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传递多个数组?

在此先感谢!

+0

如何显示过滤器tableview控制器? –

+0

我正在与故事板,并有一个segview到tableview控制器。我可以使用准备for segue函数将数据推送到它。 – user2014551

+0

您应该分配selectedpersonDelegate。而不是FTC.delegate = self;你应该写FTC。 selectedpersonDelegate = self; – Darshana

回答

0

因此,听起来好像您并没有真正在Segue为您呈现的FilterTableViewController上设置委托。只需在您的prepareForSegue:sender:方法中设置代理,您显然也在推送其他数据。

现在在你的-[SearchViewController viewDidLoad]方法,要创建其他一些实例调用FTC,并设置其代表,然后及时抛出是FTC实例上移开。这个例子与被segue推动的那个无关。

在你的其他问题:

1)是的,你应该能够看到代表那里。 2)是的,如果你想收集多个选择,那么当选择完成时通知你的委托可能更有意义。

3.)可能这种方法从来没有被调用,因为你从来没有正确设置委托。

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

希望有所帮助。

0

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