从自定义UITableViewCell和UIViewController传递数据

时间:2014-07-05 14:09:38

标签: ios objective-c xcode uitableview

我(相当)熟悉在UIViewControllers之间传递数据的segues和delegates,但我目前的情况略有不同,我无法让它工作。上下文:带有Objective C的XCode 5和iOS7。

我有一个tableview(动态原型),它加载一个包含UILabel和UISwitch的自定义单元格(来自单独的nib)。 CustomCell.xib从CustomCell.h / m加载其数据。主要内容在ViewController.h / m中,在该文件中,我需要知道开关值是否发生了变化(或实际上是UISwitch的新值)。显然我在CustomCell.h / m文件中知道这个,但需要将它们传递给ViewController.h / m。

我尝试使用委托,但我无法为UINib实例设置委托(与在viewcontroller的实例上设置委托相反)。此外,自定义单元格是在viewcontroller中实现的,因此它不会像另一个viewcontroller一样被推送到导航堆栈中。

CustomCell.h

#import <UIKit/UIKit.h>

@protocol CustomCellDelegate <NSObject>

- (void)switchControlValueChanged:(UISwitch*)switchControl toNewValue:(BOOL)value;

@end

@interface CustomCell : UITableViewCell

@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
@property (nonatomic, weak) IBOutlet UISwitch *switchControl;
@property (nonatomic, assign) id <CustomCellDelegate> delegate;

- (void)setValueForSwitchControlTo:(BOOL)value;
- (IBAction)changeColorForSwitchControl;

@end

CustomCell.m

- (void)changeColorForSwitchControl // value changed method
{
    ...
    [self.delegate switchControlValueChanged:self.switchControl toNewValue:self.switchControl.on];
}

ViewController.h

#import <UIKit/UIKit.h>
#import "CustomCell.h"

@interface ViewController : UITableViewController <CustomCellDelegate>
...
@end

ViewController.m

- (void)viewDidLoad
{
    ...
    // cannot set a delegate on the cellNib
    UINib *cellNib = [UINib nibWithNibName:kCustomCell bundle:nil];
    [self.tableView registerNib:cellNib forCellReuseIdentifier:kCustomCell];
}

- (void)switchControlValueChanged:(UISwitch *)switchControl toNewValue:(BOOL)value
{
    NSLog(@"Switch changed!"); // this is not getting displayed
}

2 个答案:

答案 0 :(得分:2)

将视图控制器设置为单元格的委托的正确时间是设置单元格的其他属性。你可以在tableView:cellForRowAtIndexPath:中完成。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCustomCell forIndexPath:indexPath];
    ...
    cell.delegate = self;
    return cell;
}

旁注:registerNib:forCellReuseIdentifier:完全按照说法执行,只是注册您的笔尖以供重复使用。在表视图决定执行此操作之前,不会加载nib的内容。它会在需要时创建包含在nib中的单元格的副本。

答案 1 :(得分:0)

一种选择是使用NSNotification,而不是优雅,但可以用于您的目的。每次切换值更改时,您都可以在CustomCell.m中发送通知,例如:

NSDictionary *cellInfo = @{}; // add useful information to identify the cell to this dictionary
[[NSNotificationCenter defaultCenter] postNotificationName:@"SwitchValueChanged" object:nil userInfo:cellInfo];

然后,您通过将其注册为观察员来捕获ViewController中的通知:

-(void)viewDidLoad
{
   [super viewDidLoad];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod) name:@"SwitchValueChanged" object:nil];
}