我已经做了一段时间的研究,进行了大量的研究,但没有找到我特别满意的解决方案。
情况如下:
tableview
是一个包含动态内容的各种设置页面。例如,当交换机在其中一个单元格中更改状态时,需要添加和删除行。为此,我选择了委托模式来通知单元格的更改
问题:
1)我不确定哪个对象应该是正确的“所有者”,因此委托自定义单元格。在我看来,uitableview
应委托细胞,然后委托给view controller
。
2)无论哪个对象委托自定义单元格,它都必须“弄清楚”哪个属性需要根据调用进行更新。这是一个问题,因为相同类型的多个单元格应用于不同的属性。
例如,假设有2个部分,每个部分有1个switch cell
。当其中一个单元格触发其委托调用以通知状态更改时,view controller
必须确定要更新的模型的哪个部分。在这个例子中,你可以很容易地检查单元格所在的哪个部分来更新模型,但是它不能真正解决问题,因为如果你将来在其中一个部分添加第二个交换单元,它会断裂。
注意: 正如您将在下面的代码中看到的那样,可以想象使用indexPath来检查正在编辑的属性。但是,它会导致if / elseif或switch语句不断增长,检查哪个属性对应于哪个indexPath。 原因是:至少有些属性不是指针,因此将它们存储在数组中并直接编辑它们不会影响数据,最终需要使用文字转换为实际的数据对象。
以下是我必须更好地说明的一些内容:
@protocol CustomUITextFieldCellDelegate <NSObject>
- (void)cellDidBeginEditingTextField:(CustomUITextFieldCell *)cell;
- (void)cellDidEndEditingTextField:(CustomUITextFieldCell *)cell;
@end
@interface CustomUITextFieldCell : UITableViewCell <UITextFieldDelegate>
@property (nonatomic, strong) NSString *title;
@property (nonatomic, assign) id <CustomUITextFieldCellDelegate> delegate;
@end
@protocol CustomTableViewDelegate <UITableViewDelegate>
- (void)textFieldCell:(CustomUITextFieldCell *)cell didBeginEditingIndexPath:(NSIndexPath *)indexPath;
- (void)textFieldCell:(CustomUITextFieldCell *)cell didEndEditingIndexPath:(NSIndexPath *)indexPath;
@end
@interface CustomTableView : UITableView <CustomUITextFieldCellDelegate>
@property (nonatomic, assign) id <CustomTableViewDelegate> delegate;
@end
在ViewController
,代理CustomUITableView
:
- (void)textFieldCell:(TTD_UITextFieldCell *)cell didBeginEditingIndexPath:(NSIndexPath *)indexPath {
// determine which property is being edited
// update model
}
提前感谢您的帮助!我很想知道你将如何解决这个问题。
答案 0 :(得分:0)
如果您在创建单元格时知道该值正在编辑哪个属性,则可以使用块而不是委托模式,如下所示:
// for text editing
typedef void (^TextCellSetValueBlock)(NSString *);
typedef NSString *(^TextCellGetValueBlock)();
@interface CustomUITextFieldCell: UITableViewCell {
// ...
@property (nonatomic, copy) TextCellSetValueBlock onSetValue;
@property (nonatomic, copy) TextCellGetValueBlock onGetValue;
// ...
}
创建单元格时,将onSetValue / onGetValue指定给从模型读取/写入相应属性的块,并在想要获取/设置属性时从单元格调用onGetValue()/ onSetValue()。
对于打开/关闭UI部分的布尔开关,您可以让onSetValue块更新模型,并添加/删除单元格作为副作用。