web-dev-qa-db-ja.com

iOSはUITableViewCells間でUIDatePickerを表示します

IOS 7では、開発者は、入力が必要なときにテーブルセル間に日付ピッカーを表示し、入力が完了したら非表示にすることをお勧めします。どうすればこの効果を達成できますか?

enter image description here

13
danielmhanover

Vasilica Costescuには、ここにすばらしいチュートリアルがあります: http://masteringios.com/blog/2013/10/31/ios-7-in-line-uidatepicker/

そして静的テーブルの場合: http://masteringios.com/blog/2013/11/18/ios-7-in-line-uidatepicker-part-2/

ここのサンプルコード: https://github.com/costescv/InlineDatePicker

重要なビットは、非表示/表示メソッドです。

 - (void)showDatePickerCell {
    self.datePickerIsShowing = YES;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    self.datePicker.hidden = NO;
    self.datePicker.alpha = 0.0f;

    [UIView animateWithDuration:0.25 animations:^{
        self.datePicker.alpha = 1.0f;
    }];
}

- (void)hideDatePickerCell {
    self.datePickerIsShowing = NO;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    [UIView animateWithDuration:0.25
                     animations:^{
                         self.datePicker.alpha = 0.0f;
                     }
                     completion:^(BOOL finished){
                         self.datePicker.hidden = YES;
                     }];
}

そして、このUITableViewDelegateメソッドは、高さを0に設定することにより、行を「非表示」にします。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section == 0 && indexPath.row == 4 && self.datePickerIsShowing == NO){
        // hide date picker row
        return 0.0f;
    }
    return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}

ボタンから、またはテーブルの行を選択するだけで、hide/showメソッドを呼び出すことができます。 (注:他の行にテキストフィールドがある場合は、textFieldDidBeginEditingデリゲートメソッドでdatePickerを非表示にする必要がある場合があります)。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0 && indexPath.row == 4) {
        if (self.datePickerIsShowing){
            [self hideDatePickerCell];
        }else {
            [self showDatePickerCell];
        }
    }
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

編集:1つのテーブルでこれらのインラインピッカービューを2つ以上使用する場合は注意が必要です。ストーリーボードからの読み込みが非常に遅い傾向があることに気づきました: iOS 7でUITableViewControllerをUIPickerViewで開くのが遅い

16
Anthony F