2014-02-12 66 views
0

我想了解iOS開發,並遵循Apple自己的教程來製作待辦事項列表。在教程後,他們建議我繼續構建應用程序,實現更多功能等等。點擊展開並在UITableViewCell中顯示更多文本

我想實現的是當用戶點擊一個單元格時,它展開並顯示額外的內容。例如:現在

Buy groceries <- "item1" 
    Buy apples <- "subitem1" 
    Buy bread <- "subitem2" 
    Buy milk <- "subitem3" 

Do homework  <- "item2" 
Go for a jog <- "item3" 

我有一個XYZToDoSubItem類和XYZToDoItem類:

Buy groceries <- "item1" 
Do homework  <- "item2" 
Go for a jog <- "item3" 

挖掘時,打開這個。 XYZToDoItemXYZToDoSubItem繼承名稱,完成狀態和創建日期。另外它有一個包含子項目的可變數組。

我也實施一組的其它功能:

  1. 當用戶「擁有」細胞進入編輯模式
  2. 當用戶雙抽頭的細胞,將其設置完成狀態爲YES和添加複選標記

所以單擊不能干擾這些功能。

我也有一個水龍頭一個「監聽器」(未完成viewDidLoad功能):

-(void) viewDidLoad { 
    UITapGestureRecognizer *stp = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
    stp.numberOfTapsRequired = 1; 
    stp.numberOfTouchesRequired = 1; 
    [stp requireGestureRecognizerToFail:dtp]; 
    [self.tableView addGestureRecognizer:stp]; 
} 

dtp是雙擊識別。

handleSingleTap功能如下:

- (void)handleSingleTap:(UITapGestureRecognizer *)gestureRecognizer { 
    CGPoint p = [gestureRecognizer locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 

    if(indexPath != nil) { 
     //Add contents to cell and update height here 
} 

}

基本上它的工作原理是,當用戶點擊一個單元格(不進行再次挖掘它(無雙擊)),handleSingleTap運行。在這裏,我們獲得了單元格的indexPath,如果這不是nil(這意味着單元被挖掘,而不是背景),我想添加更多內容到單元格並更新高度。

我該如何着手做這件事?

是否有可能只需要添加的內容爲多subtitle s,然後調用[self.tableView realoadData][self.tableView beginUpdates][self.tableView endUpdates],和iOS處理調整自己?如果是這樣的話,我該如何添加數據?我怎樣才能調用resize方法?如果不是,插入數據後如何手動調整單元格大小?

我的設置是這樣的:

In the ViewController class: 
@property NSMutableArray *toDoItems; 

In the ToDoItem class (inherits from subitem): 
@property NSMutableArray *toDoSubItems; 

In the SubItem class: 
@property NSString *itemName; 
@property BOOL completed; 
@property (readonly) NSDate *creationDate; 

我希望有人能夠找出如何解決這個問題。

在此先感謝, 亞歷山大。

回答

0

我個人非常喜歡使用[tableView beginUpdates]; [tableView endUpdates];,它給你一個非常好的動畫。 :-)

該代碼的問題是,它實際上並不實際更新單元格,它不會調用cellForRowAtIndexPath。我會建議使用前面提到的代碼來動畫更改高度,並與[tableView reloadData][tableView reloadRowsAtIndexPaths:NSArray* withRowAnimation:UITableViewRowAnimation];一起更新單元格內容。

簡單地存儲哪一行被觸摸,當cellForRowAtIndexPathheightForRowAtIndexPath被調用,檢查它是否是相同的行,並相應地採取行動。

從可用性的角度來看,我會建議將所有的子任務從一開始放在單元格中,但將它們放在單元格框架之外。這樣,當單元格被觸摸時,只有單元格高度需要改變以顯示單元框架外的視圖。這樣,你不必處理內容變化。

乾杯!

相關問題