我一直在這一段時間,做了大量的研究,但還沒有找到我特別滿意的解決方案。動態UITableView與多個自定義UITableViewCells
這裏的情況:
的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時,您將不得不使用自己的視圖控制器來實現每個tableview。所以每個tableview都可以控制自己的數據源和委託方法。然後你可以根據你的狀態控制切換tableview。 – babygau
當然,謝謝你的迴應!用戶將與自定義單元格(在這種情況下是一個文本字段單元格)交互。結束編輯後,單元格會調用didEndEditing它的委託(自定義tableview)。自定義tableview將在其委託(viewController)上調用textFieldCell:didEndEditingAtIndexPath:。此時,視圖控制器需要決定在模型中更新哪個屬性。 – user1869469