我(相当)熟悉在 UIViewController 之间传递数据的 segue 和委托(delegate),但我目前的情况略有不同,我无法让它工作。上下文:XCode 5 和 iOS7 与 Objective C。
我有一个表格 View (动态原型(prototype)),它加载包含 UILabel 和 UISwitch 的自定义单元格(来自单独的 nib)。 CustomCell.xib 从 CustomCell.h/m 加载其数据。主要内容在 ViewController.h/m 中,在该文件中,我需要知道开关值是否更改(或者实际上是 UISwitch 的新值)。显然我在 CustomCell.h/m 文件中知道这一点,但需要将它们传递给 ViewController.h/m。
我尝试使用委托(delegate),但我无法为 UINib 实例设置委托(delegate)(与在 View Controller 的实例上设置委托(delegate)相反)。此外,自定义单元格是在 View Controller 中实现的,因此它不会像另一个 View Controller 在导航堆栈中那样被推送。
CustomCell.h
#import <UIKit/UIKit.h>
@protocol CustomCellDelegate <NSObject>
- (void)switchControlValueChangedUISwitch*)switchControl toNewValueBOOL)value;
@end
@interface CustomCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
@property (nonatomic, weak) IBOutlet UISwitch *switchControl;
@property (nonatomic, assign) id <CustomCellDelegate> delegate;
- (void)setValueForSwitchControlToBOOL)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)switchControlValueChangedUISwitch *)switchControl toNewValueBOOL)value
{
NSLog(@"Switch changed!"); // this is not getting displayed
}
Best Answer-推荐答案 strong>
将您的 View Controller 设置为您的单元格的代表的正确时间是在您设置单元格的其他属性时。您可以在 tableView:cellForRowAtIndexPath: 中执行此操作。
- (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCustomCell forIndexPath:indexPath];
...
cell.delegate = self;
return cell;
}
旁注:registerNib:forCellReuseIdentifier: 完全按照它所说的去做,它只是注册你的 Nib 以供重复使用。在表格 View 决定这样做之前,不会加载 nib 的内容。它会在需要时创建包含在 Nib 中的单元格的副本。
关于ios - 从自定义 UITableViewCell 和 UIViewController 传递数据,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/24587243/
|