2014-07-27 115 views
3

我目前正在製作一個顯示用戶個人資料的應用程序。爲此,我使用帶有自定義單元格的UITableViewCell來處理不同類型的數據(電話號碼,郵件地址等)。每個配置文件最多有8個單元。防止UITableViewCells出隊並重新加載

允許用戶以最簡單的方式編輯其配置文件。當tableview的編輯模式被觸發時,所有可編輯的標籤都被textfields替換。然後在修改完成後轉回標籤。

Homever,看起來有問題的細胞是不可見的。每次它們重新出現在視圖中時,它們都會重新加載,setEditing:YES方法會再次觸發,等等。因此,文本字段中所做的每個更改都會丟失。

有沒有辦法阻止tableview刪除不可見的單元格並將其添加回來?只有8個單元,所以它不會消​​耗大量資源,每次進行更改時我都不必保存它們的狀態。 PS:我用dequeueReusableCellWithIdentifier方法和每個單元格的標識符嘗試了幾件事情,但是我沒有設法實現我想要的。每次我隱藏一個單元格時,其內容都會刷新。

+2

更堅實的方法是保存單元格的狀態。 – duci9y

回答

1

在這種情況下,您對UITableView的可重用性沒有幫助(在大多數情況下,可重用性是一件好事),但在保留編輯時會遇到太多困難。所以你可以避免重複使用,並預先準備好你的細胞。

在你的ViewController

@property (nonatomic, strong) NSMutableArray *cells; 

添加NSMutableArray伊娃或財產在你的viewDidLoad:準備cells沒有任何reuseIdentifier

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 


    //Creates tableView cells. 
    [self createCells]; 

} 

- (void)createCells 
{ 
    self.cells = [NSMutableArray array]; 

    TCTimeCell *cellCallTime = [[TCTimeCell alloc] initWithTitle:@"CALL" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeCall]; 
    [_cells addObject:cellCallTime]; 

    TCTimeCell *cellLunchOut = [[TCTimeCell alloc] initWithTitle:@"LUNCH START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchOut]; 
    [_cells addObject:cellLunchOut]; 

    TCTimeCell *cellLunchIn = [[TCTimeCell alloc] initWithTitle:@"LUNCH END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchIn]; 
    [_cells addObject:cellLunchIn]; 

    TCTimeCell *cellSecondMealOut = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealOut]; 
    [_cells addObject:cellSecondMealOut]; 

    TCTimeCell *cellSecondMealIn = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealIn]; 
    [_cells addObject:cellSecondMealIn]; 

    TCTimeCell *cellWrapTime = [[TCTimeCell alloc] initWithTitle:@"WRAP" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeWrap]; 
    [_cells addObject:cellWrapTime]; 
} 

你可以從這個數組填充您的tableView。

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return self.cells.count; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return self.cells[indexPath.row]; 
} 

如果你有一個切片的tableView,您可以準備細胞array of arrays。在這種情況下,您的數據源方法應該如下所示

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{ 
    return [self.cells count]; 
} 
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [self.cells[section] count]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return self.cells[indexPath.section][indexPath.row]; 
} 
+0

你確定它會真的解決問題嗎?如果每次單元重新出現時調用cellForRowAtIndexPath,單元格數組是否將包含原始或已修改的單元格?隱藏時會保存單元狀態嗎? 我會盡量按照你說的去做,因爲無論如何這可能是一種更乾淨的方法,如果它們作爲實例變量存儲,訪問單元格內容並保存它將更加容易。 – Pierre

+0

當然,它會的。單元格數組始終包含顯示和正在修改的單元格。它將保留所有編輯,儘管它在tableView中具有可見性。它通常的NSArray功能。 –

2

您應該使用靜態單元不動態。選擇表格視圖並更改像圖像一樣的配置。 enter image description here

並在界面構建器中添加單元格!

+0

我只使用自定義單元格來重現標準聯繫人視圖,而且似乎我沒有使用UITableViewController(但我不能說爲什麼)。所以我不認爲我可以改變'動態原型'選項。 – Pierre