2013-10-27 130 views
0

我一直在這一段時間,做了大量的研究,但還沒有找到我特別滿意的解決方案。動態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 
} 

感謝您的幫助提前!我很好奇你會如何解決這個問題。

+0

你能否告訴我關於你的用例的更多細節,更好的用於展示圖片。當涉及到使用自定義單元格的動態tableview時,您將不得不使用自己的視圖控制器來實現每個tableview。所以每個tableview都可以控制自己的數據源和委託方法。然後你可以根據你的狀態控制切換tableview。 – babygau

+0

當然,謝謝你的迴應!用戶將與自定義單元格(在這種情況下是一個文本字段單元格)交互。結束編輯後,單元格會調用didEndEditing它的委託(自定義tableview)。自定義tableview將在其委託(viewController)上調用textFieldCell:didEndEditingAtIndexPath:。此時,視圖控制器需要決定在模型中更新哪個屬性。 – user1869469

回答

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塊更新模型,並添加/刪除單元格作爲副作用。

+0

有趣的想法,謝謝你的迴應!我會研究這個。 – user1869469

相關問題