委托/协议不起作用:将数组从 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的主要内容,如果未能解决你的问题,请参考以下文章