委托/协议不起作用:将数组从 TableViewController 传递给父 ViewController

Posted

技术标签:

【中文标题】委托/协议不起作用:将数组从 TableViewController 传递给父 ViewController【英文标题】:Delegate/Protocol doesn't work: pass Array from TableViewController to parent ViewController 【发布时间】:2013-02-05 22:53:19 【问题描述】:

我有一个父 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 更好的传递 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?

提前致谢!

【问题讨论】:

过滤表视图控制器是如何呈现的? 我正在使用情节提要,并且 tableview 控制器有一个 segue。我可以使用 prepare for segue 功能将数据推送到它。 您应该分配 selectedpersonDelegate。而不是 FTC.delegate = self;你应该写FTC。 selectedpersonDelegate = self; 【参考方案1】:

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

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

关于您的其他问题:

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

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

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

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

希望对您有所帮助。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于委托/协议不起作用:将数组从 TableViewController 传递给父 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

即使在设置委托后协议也不起作用

为啥 UICollectionView 的委托方法不起作用?

从 AppDelegate 调用委托函数不起作用

协议和代表不起作用..我做错了啥?

iOS 的简单委托示例不起作用

从路线导航返回时,颤振搜索委托不起作用