我有一个父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传递多个数组?
提前感谢!
答案 0 :(得分:0)
所以听起来好像你并没有在segue为你呈现的FilterTableViewController上设置委托。只需在prepareForSegue:sender:
方法中设置代理,您也可以在其中推送其他数据。
现在,在您的-[SearchViewController viewDidLoad]
方法中,您正在创建名为FTC的其他实例,设置其委托,然后立即抛弃该FTC实例。该实例与将被segue推动的实例无关。
关于你的其他问题:
1。)是的,您应该能够在那里看到代表。
2。)是的,如果你想收集多个选项,那么在选择完成时通知你的代表可能更有意义。
3.。)可能永远不会调用此方法,因为您从未正确设置委托。
4.如果你有两个数组,你可能只在委托方法中包含两个参数。如果超过2,我会考虑数组字典或数组数组。
希望有所帮助。
答案 1 :(得分:0)
我忘了将代表设置为用户firoze想通了。这解决了我的问题