【问题标题】:Dynamic UITableView with multiple custom UITableViewCells具有多个自定义 UITableViewCells 的动态 UITableView
【发布时间】:2013-10-27 00:52:56
【问题描述】:

我已经为此工作了一段时间,进行了大量研究,但没有找到我特别满意的解决方案。

情况如下:

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
}

提前感谢您的帮助!我很想知道您将如何解决这个问题。

【问题讨论】:

  • 你能告诉我更多关于你的用例的细节吗,最好用图片来演示。当涉及到带有自定义单元格的动态表格视图时,您必须使用自己的视图控制器来实现每个表格视图。所以每个tableview都可以控制自己的datasource和delegate方法。然后你就可以根据你的状态控制来切换tableview了。
  • 好的,感谢您的回复!用户将与自定义单元格(在本例中为文本字段单元格)进行交互。结束编辑后,单元格将在其委托(自定义表格视图)上调用 didEndEditing。自定义 tableview 将在其委托(viewController)上调用 textFieldCell:didEndEditingAtIndexPath:。此时,视图控制器需要决定在模型中更新哪个属性。

标签: objective-c design-patterns uitableview model


【解决方案1】:

如果您在创建单元格时知道值正在编辑哪个属性,则可以使用块而不是委托模式,如下所示:

// 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 块更新您的模型,并添加/删除单元格作为副作用。

【讨论】:

  • 有趣的想法,感谢您的回复!我会调查一下。
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多