【问题标题】:Get UITableView to scroll to the selected UITextField and Avoid Being Hidden by Keyboard获取 UITableView 以滚动到选定的 UITextField 并避免被键盘隐藏
【发布时间】:2011-07-13 00:59:19
【问题描述】:

我在UIViewController(不是UITableViewController)的表格视图中有一个UITextField。 如果表格视图位于UITableViewController 上,表格将自动滚动到正在编辑的textField,以防止它被键盘隐藏。但在 UIViewController 上却没有。

我已经尝试了几天阅读多种方法来尝试实现这一点,但我无法让它发挥作用。最接近实际滚动的是:

-(void) textFieldDidBeginEditing:(UITextField *)textField {

// SUPPOSEDLY Scroll to the current text field

CGRect textFieldRect = [textField frame];
[self.wordsTableView scrollRectToVisible:textFieldRect animated:YES];

}

但是,这只会将表格滚动到最上面一行。 几天的挫败感似乎是一件容易的事。

我正在使用以下内容来构建 tableView 单元格:

- (UITableViewCell *)tableView:(UITableView *)aTableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

NSString *identifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition: 0], [indexPath indexAtPosition:1]];

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] 
        initWithStyle:UITableViewCellStyleDefault 
        reuseIdentifier:identifier] autorelease];

        cell.accessoryType = UITableViewCellAccessoryNone;

        UITextField *theTextField = [[UITextField alloc] initWithFrame:CGRectMake(180, 10, 130, 25)];

        theTextField.adjustsFontSizeToFitWidth = YES;
        theTextField.textColor = [UIColor redColor];
        theTextField.text = [textFieldArray objectAtIndex:indexPath.row];
        theTextField.keyboardType = UIKeyboardTypeDefault;
        theTextField.returnKeyType = UIReturnKeyDone;
        theTextField.font = [UIFont boldSystemFontOfSize:14];
        theTextField.backgroundColor = [UIColor whiteColor];
        theTextField.autocorrectionType = UITextAutocorrectionTypeNo;
        theTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
        theTextField.clearsOnBeginEditing = NO;
        theTextField.textAlignment = UITextAlignmentLeft;

        //theTextField.tag = 0;
        theTextField.tag=indexPath.row;

        theTextField.delegate = self;

        theTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
        [theTextField setEnabled: YES];

        [cell addSubview:theTextField];

        [theTextField release];


}

return cell;
}

如果我能以某种方式在textFieldDidBeginEditing 方法中传递indexPath.row,我怀疑我可以让tableView 正确滚动?

感谢任何帮助。

【问题讨论】:

    标签: xcode uitableview keyboard uitextfield


    【解决方案1】:

    在我的应用中,我成功地使用了contentInsetscrollToRowAtIndexPath 的组合,如下所示:

    当你想显示键盘时,只需在底部添加一个 contentInset 和你想要的高度:

    tableView.contentInset =  UIEdgeInsetsMake(0, 0, height, 0);
    

    那么,你就可以放心使用了

    [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:cell_index inSection:cell_section] animated:YES];
    

    通过添加 contentInset,即使您关注最后一个单元格,tableView 仍然可以滚动。只需确保在关闭键盘时重置 contentInset。

    编辑:
    如果你只有一个部分(你可以将cell_section替换为0)并且使用textView标签来通知单元格行。

    【讨论】:

    • 你的意思是:tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, height);
    • 对不起,我的错误。我是从我的记忆中输入这个的。我已编辑我的帖子以更正此问题
    • 好消息是我现在使用: [[wordsTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:5 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];我确实让 tableView 滚动到第 5 行。但我需要弄清楚正在调用哪一行。
    • 我认为您的意思是 UIEdgeInsetsMake(0, 0, height, 0),但除此之外是一个非常优雅的解决方案!赞一个!
    • 谢谢安德烈,这件事让我发疯了,我不敢相信没有简单的解决方案。但是有,谢谢!
    【解决方案2】:

    斯威夫特

    @objc private func keyboardWillShow(_ notification: Notification) {
        guard let userinfo = notification.userInfo else {
            return
        }
    
        guard
            let duration = (userinfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue,
            let endFrame = (userinfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
            let curveOption = userinfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {
                return
        }
        
        UIView.animate(withDuration: duration, delay: 0, options: [.beginFromCurrentState, .init(rawValue: curveOption)], animations: {
            let edgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: endFrame.height, right: 0)
            self.scrollView.contentInset = edgeInsets
            self.scrollView.scrollIndicatorInsets = edgeInsets
        })
    }
    
    @objc private func keyboardWillHide(_ notification: Notification) {
        guard let userinfo = notification.userInfo else {
            return
        }
    
        guard
            let duration = (userinfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue,
            let curveOption = userinfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {
                return
        }
        
        UIView.animate(withDuration: duration, delay: 0, options: [.beginFromCurrentState, .init(rawValue: curveOption)], animations: {
            let edgeInsets = UIEdgeInsets.zero
            self.scrollView.contentInset = edgeInsets
            self.scrollView.scrollIndicatorInsets = edgeInsets
        })
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ...
    
        subscribeToKeyboardNotifications()
    }
    
    deinit {
        unsubscribeFromKeyboardNotifications()
    }
    
    private func subscribeToKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIWindow.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIWindow.keyboardWillHideNotification, object: nil)
    }
    
    private func unsubscribeFromKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: UIWindow.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIWindow.keyboardWillHideNotification, object: nil)
    }
    

    目标 C

    - (void)keyboardWillShow:(NSNotification *)sender
    {
        CGFloat height = [[sender.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
        NSTimeInterval duration = [[sender.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        UIViewAnimationOptions curveOption = [[sender.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue] << 16;
        
        [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState|curveOption animations:^{
            UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, height, 0);
            tableView.contentInset = edgeInsets;
            tableView.scrollIndicatorInsets = edgeInsets;
        } completion:nil];
    }
    
    - (void)keyboardWillHide:(NSNotification *)sender
    {
        NSTimeInterval duration = [[sender.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        UIViewAnimationOptions curveOption = [[sender.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue] << 16;
    
        [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState|curveOption animations:^{
            UIEdgeInsets edgeInsets = UIEdgeInsetsZero;
            tableView.contentInset = edgeInsets;
            tableView.scrollIndicatorInsets = edgeInsets;
        } completion:nil];
    }
    

    而在 - (void)viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    

    然后

    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    【讨论】:

    • - (IBAction) 用于需要链接到 Interface Builder 组件的方法。使用 -(无效)。您没有指定 indexPath 是如何在这里获取的。
    • @quantumpotato 是的,正确的。 -(void) textFieldDidBeginEditing:(UITextField *)textField { UITableViewCell *cell = (UITableViewCell *)[textField superview]; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; }
    • 但是这个方法在iOS6中是行不通的。在 iOS6 上有任何替代方案吗?
    • Seconding @dineshsurya,是否有修复程序可以在 iOS6 上也能正常工作?
    • 谢谢你,我能找到最好的答案。
    【解决方案3】:

    这是对 FunkyKat 答案的调整(非常感谢 FunkyKat!)。不为将来的 iOS 兼容性硬编码 UIEdgeInsetsZero 可能是有益的。

    相反,我要求当前的插入值并根据需要调整底部值。

    - (void)keyboardWillShow:(NSNotification *)sender {
        CGSize kbSize = [[[sender userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
        NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
        CGFloat height = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? kbSize.height : kbSize.width;
        if (isIOS8()) height = kbSize.height;
    
        [UIView animateWithDuration:duration animations:^{
            UIEdgeInsets edgeInsets = [[self tableView] contentInset];
            edgeInsets.bottom = height;
            [[self tableView] setContentInset:edgeInsets];
            edgeInsets = [[self tableView] scrollIndicatorInsets];
            edgeInsets.bottom = height;
            [[self tableView] setScrollIndicatorInsets:edgeInsets];
        }];
    }
    
    - (void)keyboardWillHide:(NSNotification *)sender {
        NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
        [UIView animateWithDuration:duration animations:^{
            UIEdgeInsets edgeInsets = [[self tableView] contentInset];
            edgeInsets.bottom = 0;
            [[self tableView] setContentInset:edgeInsets];
            edgeInsets = [[self tableView] scrollIndicatorInsets];
            edgeInsets.bottom = 0;
            [[self tableView] setScrollIndicatorInsets:edgeInsets];
        }];
    }
    

    【讨论】:

    • 你如何从捕获这样的通知中获取 indexPath?
    • 我正在评论我自己的答案,因为昨天有人编辑了我的答案,我不同意。他们在第五行交换了身高和体重参数。这是不正确的。在 iOS8 之前,我原来的答案很好。在 iOS8 之后,Apple 将这些高度和宽度值更改为根据方向返回(或者相反?),因此 if isIOS8() 调用。我将把该方法的实现留给读者。
    【解决方案4】:

    为了其他人遇到这个问题,我在这里发布必要的方法:

    - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        NSString *identifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition: 0], [indexPath indexAtPosition:1]];
    
        UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier];
    
        if (cell == nil) {
    
            cell = [[[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    
            UITextField *theTextField = [[UITextField alloc] initWithFrame:CGRectMake(180, 10, 130, 25)];
    
            theTextField.keyboardType = UIKeyboardTypeDefault;
            theTextField.returnKeyType = UIReturnKeyDone;
            theTextField.clearsOnBeginEditing = NO;
            theTextField.textAlignment = UITextAlignmentLeft;
    
            // (The tag by indexPath.row is the critical part to identifying the appropriate
            // row in textFieldDidBeginEditing and textFieldShouldEndEditing below:)
    
            theTextField.tag=indexPath.row;
    
            theTextField.delegate = self;
    
            theTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
            [theTextField setEnabled: YES];
    
            [cell addSubview:theTextField];
    
            [theTextField release];
    
        }
    
        return cell;
    }
    
    -(void) textFieldDidBeginEditing:(UITextField *)textField {
    
        int z = textField.tag;                                              
    
        if (z > 4) {
    
            // Only deal with the table row if the row index is 5 
            // or greater since the first five rows are already 
            // visible above the keyboard   
    
            // resize the UITableView to fit above the keyboard
    
            self.wordsTableView.frame = CGRectMake(0.0,44.0,320.0,200.0);       
    
            // adjust the contentInset
    
            wordsTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 10);        
    
            // Scroll to the current text field
    
            [wordsTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:z inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    
        }
    }
    
    
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    
        // Determine which row is being edited
    
        int z = textField.tag;  
    
        if (z > 4) {
    
            // resize the UITableView to the original size
    
            self.wordsTableView.frame = CGRectMake(0.0,44.0,320.0,416.0);       
    
            // Undo the contentInset
            wordsTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);         
    
        }
    
        return YES;
    
    }
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
    
        // Dismisses the keyboard when the "Done" button is clicked
    
        [textField resignFirstResponder];
    
        return YES;                                 
    
    }
    

    【讨论】:

      【解决方案5】:

      我需要一个简单的解决方案,所以对我来说helped

      func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
              let pointInTable = textField.superview!.convert(textField.frame.origin, to: tableView)
              var tableVContentOffset = tableView.contentOffset
              tableVContentOffset.y = pointInTable.y
              if let accessoryView = textField.inputAccessoryView {
                  tableVContentOffset.y -= accessoryView.frame.size.height
              }
              tableView.setContentOffset(tableVContentOffset, animated: true)
              return true;
          }
      

      【讨论】:

      • 你可以把它变小,不需要调用superview,你可以用contentOffset.x和point.y创建一个cgpoint变量,你可以直接设置到tableview内容偏移
      【解决方案6】:

      试试我的编码,这对你有帮助

      tabelview.contentInset =  UIEdgeInsetsMake(0, 0, 210, 0);
      [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:your_indexnumber inSection:Your_section]
                       atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
      

      【讨论】:

        【解决方案7】:

        Apple 有一篇官方帖子解释了如何像在 UITableViewController 中那样自然地执行此操作。我的 Stackoverflow 回答对此进行了解释,并附有 swift 版本。

        https://stackoverflow.com/a/31869898/1032179

        【讨论】:

          【解决方案8】:

          您需要调整 tableView 本身的大小,使其不会进入键盘下方。

          -(void) textFieldDidBeginEditing:(UITextField *)textField {
          
          // SUPPOSEDLY Scroll to the current text field
          self.worldsTableView.frame = CGRectMake(//make the tableView smaller; to only be in the area above the keyboard);
          CGRect textFieldRect = [textField frame];
          [self.wordsTableView scrollRectToVisible:textFieldRect animated:YES];
          
          }
          

          或者,您可以使用键盘通知;这会稍微好一些,因为您有更多信息,并且在知道键盘何时出现方面更加一致:

          //ViewDidLoad
          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
          

          然后执行:

          - (void)keyboardWillShow:(NSNotification *)notification {
          
          }
          - (void)keyboardWillHide:(NSNotification *)notification {
          
          }
          

          【讨论】:

          • 我将表格调整为 200 像素以适合键盘上方,但以下只会将表格向上滚动到第一行,而不是向下滚动到隐藏行:CGRect textFieldRect = [textField frame]; [self.wordsTableView scrollRectToVisible:textFieldRect 动画:YES];
          • 你能用scrollToRowAtIndexPath:代替吗?那会更简单。如果不是,则问题在于 textFieldRect 是 textField 的框架,它的框架与其父视图(即 contentView 或 tableViewCell)相关。您需要将rect转换为tableView的坐标系,而不是tableViewCell。为此使用convertRect:toView:
          • 我认为 textFieldRect 只给了我第一行,因为它是视图中的一个框架,正如你所建议的,这就是它只滚动到最上面一行的原因。我不知道如何使用 convertRect:toView:
          • CGRect myFrame = [textField convertRect:textFieldRect toView:self.worldsTableView]; 然后滚动到 myFrame 而不是 textFieldRect。
          • CGRect myFrame = [textField convertRect:textFieldRect toView:self.worldsTableView];也不工作...
          【解决方案9】:

          我的代码。也许有人会有用: tableView 中的自定义 textField 单元格

          .m

              @property (nonatomic, strong) UITextField *currentCellTextField;
          
                 CustomCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
                      if (cell == nil) {
                          NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
                          cell = (CustomCell *)[nib objectAtIndex:0];
                          cell.textfield.delegate = self;
                      }
                - (void) textFieldDidBeginEditing:(UITextField *)textField
           {
            self.currentCellTextField = textField;
          
            CGPoint pnt = [self.organisationTableView convertPoint:textField.bounds.origin fromView:textField];
            NSIndexPath* path = [self.organisationTableView indexPathForRowAtPoint:pnt];
          
          if (path.section >= 2) {
              [UIView beginAnimations:nil context:NULL];
              [UIView setAnimationDuration:0.3];
              self.organisationTableView.contentInset = UIEdgeInsetsMake(0, 0, kOFFSET_FOR_KEYBOARD, 0);
              CGPoint siize = self.organisationTableView.contentOffset;
              siize.y =(pnt.y-170);
              self.organisationTableView.contentOffset = CGPointMake(0, siize.y);
              [UIView commitAnimations];
              }
           }
          
            -(BOOL)textFieldShouldReturn:(UITextField *)textField
            {
             [textField resignFirstResponder];
          
          CGPoint pnt = [self.organisationTableView convertPoint:textField.bounds.origin fromView:textField];
          NSIndexPath* path = [self.organisationTableView indexPathForRowAtPoint:pnt];
          
           if (path.section >= 2) {
              [UIView beginAnimations:nil context:NULL];
              [UIView setAnimationDuration:0.3];
              self.organisationTableView.contentInset = UIEdgeInsetsZero;
              self.organisationTableView.contentOffset = CGPointMake(0, self.organisationTableView.contentOffset.y);
              [UIView commitAnimations];
                }
          
           return YES;
             }
          

          【讨论】:

            【解决方案10】:

            在我的情况下,我的 UITableview 在另一个 UIView 中,而 UIvie 在主 UIScrollview 中。所以我对这类问题使用了更通用的解决方案。 我只是在特定的 UIScrollView 中找到了我的单元格的 Y 坐标,然后滚动到正确的点:

            -(void)textFieldDidBeginEditing:(UITextField *)textField{
            float kbHeight = 216;//Hard Coded and will not support lanscape mode
            UITableViewCell *cell = (UITableViewCell *)[textField superview];
            float scrollToHeight = [self FindCordinate:cell];
            [(UIScrollView *)self.view setContentOffset:CGPointMake(0, scrollToHeight - kbHeight + cell.frame.size.height) animated:YES];
            }
            
            -(float)FindCordinate:(UIView *)cell{
            float Ycordinate = 0.0;
            while ([cell superview] != self.view) {
                Ycordinate += cell.frame.origin.y;
                cell = [cell superview];
            }
            Ycordinate += cell.frame.origin.y;
            return Ycordinate;
            }
            

            【讨论】:

              【解决方案11】:

              另一个简单的解决方案是为最后一个表格部分的页脚添加一个额外的空间:

              - (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
                  if (section == lastSection) {
                      return keyboard height;
                  }
                  return 0;
              }
              

              我们也可以将我们的图标添加到这个区域。 :)

              【讨论】:

                【解决方案12】:

                您可以尝试将 UITableViewController 添加到 UIViewController 而不仅仅是表格视图。这样你就可以调用 UITableViewController 的 viewWillAppear 并且一切都会正常工作。

                例子:

                - (void)viewWillAppear:(BOOL)animated {
                    [super viewWillAppear:animated];
                    [tableViewController viewWillAppear:animated];
                }
                

                【讨论】:

                  【解决方案13】:

                  我为@FunkyKat 和@bmauter 的答案添加了一个小功能(顺便说一句,答案很好,应该是被接受的)

                  在键盘出现之前/之后保留常规的表格视图边缘插图。

                  - (void)keyboardWillShow:(NSNotification *)sender
                  {
                      CGSize kbSize = [[[sender userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
                      NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
                  
                      CGFloat height = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? kbSize.width : kbSize.height;
                  
                      [UIView animateWithDuration:duration animations:^{
                          UIEdgeInsets edgeInsets = self.tableView.contentInset;
                          edgeInsets.bottom += height;
                          self.tableView.contentInset = edgeInsets;
                          edgeInsets = self.tableView.scrollIndicatorInsets;
                          edgeInsets.bottom += height;
                          self.tableView.scrollIndicatorInsets = edgeInsets;
                      }];
                  }
                  
                  - (void)keyboardWillHide:(NSNotification *)sender
                  {
                      CGSize kbSize = [[[sender userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
                      NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
                  
                      CGFloat height = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? kbSize.width : kbSize.height;
                  
                      [UIView animateWithDuration:duration animations:^{
                          UIEdgeInsets edgeInsets = self.tableView.contentInset;
                          edgeInsets.bottom -= height;
                          self.tableView.contentInset = edgeInsets;
                          edgeInsets = self.tableView.scrollIndicatorInsets;
                          edgeInsets.bottom -= height;
                          self.tableView.scrollIndicatorInsets = edgeInsets;
                      }];
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-05-22
                    • 1970-01-01
                    • 2014-11-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-03-26
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多