我已经为此工作了一段时间,做了很多研究,但还没有找到我特别满意的解决方案。
情况如下:
这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
}
提前感谢您的帮助!我很想知道你将如何解决这个问题。