17

と を使用UITableViewestimatedRowHeightていUITableViewAutomaticDimensionます。またNSFetchedResultsControllerDelegate、変更を反映するために使用しています。

すべて正常に動作しています。ここでの問題は、デリゲートと呼ばれるレコードを に追加するCoreDataNSFetchedResultsController、予期しないことが発生することです。TableViewは毎回突然トップにスクロールします。

NSFetchedResultsControllerDelegate

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
        switch type {
        case .Insert:
            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .None)
            break

        case .Update:
            tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
            break

        case .Delete:
            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
            break

        default: break;
        }
    }

グーグルで、人々が使用を提案した回答tableView: heightForRowAtIndexPath:はほとんど見つかりませんでしたが、私のセルの高さは動的です。それで、私は何をすべきですか?

4

7 に答える 7

7

これはテーブルビューのデフォルトの動作で、テーブルビューに行を挿入すると一番上にスクロールします。アプリで同じ問題に直面しました。テーブルビューのコンテンツオフセットを管理する方法は次のとおりです。手順に従ってください。

1) 行またはセクションを挿入する前に、UITableview のコンテンツ オフセットを格納します。

2) オブジェクトを配列に挿入します。

3) テーブルビューをリロードする

4)差を差し引いてコンテンツオフセットを手動で設定します。

let oldOffset: CGFloat = tblTest.contentSize.height
tblTest.reloadData()
let newOffset: CGFloat = tblTest.contentSize.height
tblTest.setContentOffset(CGPointMake(0, (newOffset - oldOffset)), animated: false)

これは私がこれまでアプリケーションで行ってきた方法であり、動的セルを使用して毎回セルの再初期化を克服すると、驚くほどうまく機能します。

于 2016-10-14T12:15:03.280 に答える
4

私の問題を解決するために、セルの高さをwillDisplayメソッドに保存しestimatedHeightForRowAt、値を取得しています。

var cellHeights = NSMutableDictionary()

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = cellHeights.object(forKey: indexPath) {
        return height as! CGFloat
    }

    return UITableViewAutomaticDimension
}

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cellHeights.setObject(cell.frame.size.height, forKey: indexPath as NSCopying)
}
于 2016-10-13T09:52:13.863 に答える
1
  func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
    switch type {
    case .Insert:

      tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .None)
        break

    case .Update:
        tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
        break

    case .Delete:
        tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
        break

    default: break;
    }
   tableView.reloadData()
  let indexPath = NSIndexPath(forRow: 0, inSection: 0)
  self. tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
   }

}
于 2016-05-09T10:15:06.770 に答える
1
tableView.reloadData()
if tableView.numberOfRowsInSection(0) > 0
{
      let indexPath = NSIndexPath(forRow: 0, inSection: 0)
      self. tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
于 2016-05-03T10:33:46.170 に答える
-1
func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    tabelView.reloadData()
}

これは私の仕事です

于 2016-11-03T07:08:25.403 に答える
-1
let cou : Int = self.Array.count as Int
let lastindex : NSIndexPath = NSIndexPath(forRow: cou-1, inSection: 0)
self.TableName.scrollToRowAtIndexPath(lastindex, atScrollPosition: UITableViewScrollPosition.None, animated: true)

このコードは、特定の位置でテーブルビューをスクロールするのに役立ちます。

于 2016-10-15T04:47:38.120 に答える