วิธีเลื่อนไปที่ด้านล่างของ UITableView บน iPhone ก่อนมุมมองจะปรากฏขึ้น


136

ฉันมีUITableViewเซลล์ที่มีความสูงแปรผัน ฉันต้องการให้ตารางเลื่อนไปที่ด้านล่างเมื่อมุมมองถูกผลักเข้าสู่มุมมอง

ฉันมีฟังก์ชั่นต่อไปนี้

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];

บันทึกเป็นอาร์เรย์ที่ไม่แน่นอนที่มีวัตถุที่ประกอบขึ้นเป็นเนื้อหาของแต่ละเซลล์

โค้ดด้านบนใช้งานได้ดีviewDidAppearแต่สิ่งนี้มีผลข้างเคียงที่โชคร้ายของการแสดงส่วนบนของตารางเมื่อมุมมองปรากฏขึ้นครั้งแรกและจากนั้นข้ามไปที่ด้านล่าง ฉันอยากได้ถ้าtable viewเลื่อนไปด้านล่างก่อนที่มันจะปรากฏขึ้น

ฉันลองเลื่อนดูviewWillAppearและviewDidLoadในทั้งสองกรณีข้อมูลยังไม่ถูกโหลดลงในตารางและทั้งสองมีข้อยกเว้น

คำแนะนำใด ๆ ที่จะได้รับการชื่นชมมากแม้ว่ามันจะเป็นเพียงกรณีของการบอกฉันว่าฉันมีทุกอย่างที่เป็นไปได้

คำตอบ:


148

ฉันเชื่อว่าการโทร

 tableView.setContentOffset(CGPoint(x: 0, y: CGFloat.greatestFiniteMagnitude), animated: false)

จะทำในสิ่งที่คุณต้องการ


14
ขอบคุณมากค่ะ ฉันสร้าง CGPoint ด้วยค่า Y ที่สูงพอที่จะทำให้แสดงด้านล่างได้เสมอ เมื่อมุมมองโหลดแล้วฉันสามารถใช้ (self.table.contentSize.height - self.table.ize.size.height) เพื่อย้ายไปด้านล่างด้วยวิธีการเดียวกัน
acqu13sce

8
แม้ว่านี่จะเป็นคำตอบที่สมบูรณ์แบบเพราะเราไม่จำเป็นต้องคำนวณจำนวนเซลล์ความสูงของมุมมองบนโต๊ะอาหาร ฯลฯ แต่ฉันจะชี้ให้เห็นว่าเราต้องเรียกสิ่งนี้ก่อนที่จะโหลดมุมมอง Table ... มันจะไม่ทำงานถ้าเรา เขียนสิ่งนี้หลังจาก[table reloadData];
Fahim Parkar

4
ไม่ทำงานบน ios 10-12 - ตารางหายไปเป็นครั้งแรก
Vyachaslav Gerchicov

2
หรือเพียงแค่เลื่อนไปที่CGPoint(x: 0, y: tableView.contentSize.height)?
Amber K

5
อ๊ะ !!! ทำให้ตารางหายไป: -o ดีที่สุดโดยใช้ [self.table scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionBottom เคลื่อนไหว: NO];
Carl Hine

122

ฉันคิดว่าวิธีที่ง่ายที่สุดคือ:

if (self.messages.count > 0)
{
    [self.tableView 
        scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.messages.count-1 
        inSection:0] 
        atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

เวอร์ชั่น Swift 3:

if messages.count > 0 {
    userDefinedOptionsTableView.scrollToRow(at: IndexPath(item:messages.count-1, section: 0), at: .bottom, animated: true)
}

3
ไม่สามารถใช้งานได้หากเซลล์มีขนาดสูงกว่า UITableView
Olav Gausaker

3
เซลล์สูงกว่า UITableView หรือไม่ ไม่เคยได้ยินกรณีการใช้งานดังกล่าว
Chamira Fernando

@ChamiraFernando นี่เป็นวิธีที่ง่ายที่สุด :)
AITAALI_ABDERRAHMANE

หมายเหตุว่ามันอาจจะทำให้ความรู้สึกที่จะเข้ามาแทนที่โดยดำเนินการแล้วmessages.count myTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)ใช่นานกว่า แต่อาจหลีกเลี่ยงการทำซ้ำรหัส คุณต้องจัดการกับตัวเลือกdataSource(อย่าบังคับให้แกะในตัวอย่างนี้)
Nikolay Suvandzhiev

@ChamiraFernando ฉันรู้ว่าคำถามนี้เก่า แต่เพียงเพราะคุณไม่เคยเห็นมันไม่ได้หมายความว่ามันจะไม่เกิดขึ้น เพื่อตอบคำถามของคุณแอพอย่าง Foursquare อาจมีสถานการณ์เช่นนี้ซึ่งผู้ใช้เขียนความเห็น ความสูงของเซลล์นั้นสูงกว่าความสูงของมุมมองโต๊ะ มันเป็นสถานการณ์ที่ดีอย่างสมบูรณ์
Caio

121

จากคำตอบของยาโคบนี่คือรหัส:

- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.messagesTableView.contentSize.height > self.messagesTableView.frame.size.height) 
    {
        CGPoint offset = CGPointMake(0, self.messagesTableView.contentSize.height - self.messagesTableView.frame.size.height);
        [self.messagesTableView setContentOffset:offset animated:YES];
    }
}

ใน iOS 11 คุณควรใช้ความสูงเฟรมมุมมองตารางที่ปรับแล้ว:UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Slav

41

หากคุณต้องการเลื่อนไปยังส่วนท้ายของเนื้อหาที่ถูกต้องคุณสามารถทำสิ่งนี้ได้:

- (void)scrollToBottom
{
    CGFloat yOffset = 0;

    if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
        yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
    }

    [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}

7
ทำงานร่วมกับการชำระอัตโนมัติ แต่เป็นสิ่งสำคัญที่จะเรียกวิธีการนี้จาก viewDidLayoutSubviews
Omaty

คุณช่วยกรุณาอธิบายว่าทำไมเราต้องทำเช่นนี้: yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height; ? ขอบคุณ
Unheilig

3
@Unheilig หากคุณเลื่อนไปself.tableView.contentSize.heightที่เนื้อหาของมุมมองตารางอาจมองไม่เห็นเพราะคุณเลื่อนไปด้านล่างเนื้อหา ดังนั้นคุณต้องเลื่อนไปที่หนึ่ง "ช่องว่างมุมมองตารางที่มองเห็นได้" เหนือจุดสิ้นสุดของมุมมองตาราง
ฮันส์

31

ฉันกำลังใช้การค้นหาอัตโนมัติและไม่มีคำตอบใดที่เหมาะกับฉัน นี่คือทางออกของฉันที่ใช้งานได้ในที่สุด:

@property (nonatomic, assign) BOOL shouldScrollToLastRow;


- (void)viewDidLoad {
    [super viewDidLoad];

    _shouldScrollToLastRow = YES;
}


- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    // Scroll table view to the last row
    if (_shouldScrollToLastRow)
    {
        _shouldScrollToLastRow = NO;
        [self.tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];
    }
}

1
เกือบจะใช้งานได้สำหรับฉัน แต่ฉันได้รับข้อผิดพลาดแบบกราฟิกแปลก ๆ ในขณะที่ข้อมูลตารางของฉันกำลังโหลดจาก API ภายนอก ในกรณีของฉันฉันต้องโทรไปsetContentOffsetที่จุดอื่นเมื่อข้อมูลถูกดึงและโหลดมุมมอง tableview?
jmoz

ลองตั้งค่าออฟเซ็ตในตัวจัดการความสมบูรณ์ของคำขอของคุณ
RaffAl

2
สิ่งนี้ไม่ทำงานใน iOS 10 - แสดงตารางที่มีพื้นหลังสีดำเพียง
RunLoop

2
แทนที่จะใช้CGFLOAT_MAXฉันใช้contentSize.height - frame.height + contentInset.bottomเมื่อตั้งค่าการชดเชยเนื้อหาเริ่มต้น การใช้CGFLOAT_MAXดูเหมือนจะเลอะสำหรับฉัน
Baza207

23

โซลูชั่นที่ได้รับการยอมรับโดย @JacobRelkinไม่ทำงานสำหรับฉันใน iOS 7.0 โดยใช้เค้าโครงอัตโนมัติ

ฉันมี subclass กำหนดเองUIViewControllerและเพิ่มตัวแปรเช่น_tableViewเป็น subview viewของมัน ฉันจัดตำแหน่ง_tableViewโดยใช้เค้าโครงอัตโนมัติ ฉันลองโทรหาวิธีนี้ในตอนท้ายviewDidLoadและviewWillAppear:ต่อมา ไม่ทำงาน

ดังนั้นฉันเพิ่มวิธีการต่อไปนี้เพื่อ subclass UIViewControllerกำหนดเองของฉัน

- (void)tableViewScrollToBottomAnimated:(BOOL)animated {
    NSInteger numberOfRows = [_tableView numberOfRowsInSection:0];
    if (numberOfRows) {
        [_tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:numberOfRows-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:animated];
    }
}

การเรียกร้อง [self tableViewScrollToBottomAnimated:NO]เมื่อสิ้นสุดการviewDidLoadทำงาน น่าเสียดายที่มันยังทำให้tableView:heightForRowAtIndexPath:ถูกเรียกสามครั้งสำหรับทุกเซลล์


23

นี่คือส่วนขยายที่ฉันใช้ใน Swift 2.0 ควรเรียกใช้ฟังก์ชั่นเหล่านี้หลังจากtableviewโหลดเสร็จแล้ว:

import UIKit

extension UITableView {
    func setOffsetToBottom(animated: Bool) {
        self.setContentOffset(CGPointMake(0, self.contentSize.height - self.frame.size.height), animated: true)
    }

    func scrollToLastRow(animated: Bool) {
        if self.numberOfRowsInSection(0) > 0 {
            self.scrollToRowAtIndexPath(NSIndexPath(forRow: self.numberOfRowsInSection(0) - 1, inSection: 0), atScrollPosition: .Bottom, animated: animated)
        }
    }
}

3
สิ่งนี้ดีกว่าการใช้ขนาดเนื้อหา สำหรับ Swift3 ถ้า self.numberOfRows (inSection: 0)> 0 {self.scrollToRow (ที่: IndexPath.init (แถว: self.numberOfRows (inSection: 0) -1, ส่วน: 0), ที่: .bottom, เคลื่อนไหว: animated)}
Soohwan Park

ถ้า scrollToLastRow วิธีการนี้ใช้ไม่ได้ผลก็แค่เพิ่ม self.layoutIfNeeded () และมันก็ทำงานได้อย่างสมบูรณ์แบบ !!
Yogesh Patel

16

รายละเอียด

  • Xcode 8.3.2, swift 3.1
  • Xcode 10.2 (10E125), Swift 5

รหัส

import UIKit

extension UITableView {
    func scrollToBottom(animated: Bool) {
        let y = contentSize.height - frame.size.height
        if y < 0 { return }
        setContentOffset(CGPoint(x: 0, y: y), animated: animated)
    }
}

การใช้

tableView.scrollToBottom(animated: true)

ตัวอย่างเต็ม

อย่าลืมวางรหัสโซลูชัน!

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?
    private lazy var cellReuseIdentifier = "CellReuseIdentifier"

    override func viewDidLoad() {
        super.viewDidLoad()
        let tableView = UITableView(frame: view.frame)
        view.addSubview(tableView)
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        self.tableView = tableView
        tableView.dataSource = self
        tableView.performBatchUpdates(nil) { [weak self] result in
            if result { self?.tableView?.scrollToBottom(animated: true) }
        }
    }
}

extension ViewController: UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath )
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }
}

15

จริงๆแล้ววิธี "Swifter" ในการทำอย่างรวดเร็วคือ:

var lastIndex = NSIndexPath(forRow: self.messages.count - 1, inSection: 0)
self.messageTableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)

ทำงานที่สมบูรณ์แบบสำหรับฉัน


9

ฉันต้องการให้โต๊ะโหลดพร้อมท้ายตารางที่แสดงในเฟรม ฉันพบว่าใช้

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([self.tableView numberOfRowsInSection:0] - 1) inSection:0];
[[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];

ไม่ทำงานเพราะให้ข้อผิดพลาดเมื่อความสูงของตารางน้อยกว่าความสูงของเฟรม โปรดทราบว่าตารางของฉันมีเพียงส่วนเดียว

โซลูชันที่ใช้งานได้สำหรับฉันคือการใช้รหัสต่อไปนี้ใน viewWillAppear:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// on the initial cell load scroll to the last row (ie the latest Note)
if (initialLoad==TRUE) {
    initialLoad=FALSE; 
    NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([self.tableView numberOfRowsInSection:0] - 1) inSection:0];
    [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
        CGPoint offset = CGPointMake(0, (1000000.0));
        [self.tableView setContentOffset:offset animated:NO];
    }
}

BOOL ivar initialLoad ถูกตั้งค่าเป็น TRUE ใน viewDidLoad


คุณต้องการโทรscrollToRowAtIndexPathเลยหรือไม่? คุณโทรไปแล้วsetContentOffsetหลังจากนั้นซึ่งอาจทำให้การโทรครั้งแรกไม่มีจุดหมาย
Carlos P

9

สำหรับ Swift:

if tableView.contentSize.height > tableView.frame.size.height {
    let offset = CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.size.height)
    tableView.setContentOffset(offset, animated: false)
}


5

สำหรับ Swift 3 (Xcode 8.1):

override func viewDidAppear(_ animated: Bool) {
    let numberOfSections = self.tableView.numberOfSections
    let numberOfRows = self.tableView.numberOfRows(inSection: numberOfSections-1)

    let indexPath = IndexPath(row: numberOfRows-1 , section: numberOfSections-1)
    self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: true)
}

3
นี่ไม่ได้ตอบคำถาม OP นี่คือสิ่งที่ทำงานตั้งแต่เริ่มต้น นอกจากนี้คุณควรเรียก super.viewDidAppear
สตรีม

4

เป็นข้อบกพร่องแน่นอน อาจเป็นรหัสของคุณที่ใช้table.estimatedRowHeight = value(ตัวอย่างเช่น 100) แทนที่ค่านี้ด้วยค่าสูงสุดที่คุณคิดว่าความสูงของแถวอาจได้รับเช่น 500 .. วิธีนี้จะช่วยแก้ปัญหาร่วมกับรหัสต่อไปนี้:

//auto scroll down example
let delay = 0.1 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

dispatch_after(time, dispatch_get_main_queue(), {
    self.table.scrollToRowAtIndexPath(NSIndexPath(forRow: self.Messages.count - 1, inSection: 0), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
})

4

หลังจากเล่นซอนี่เป็นสิ่งที่ได้ผลสำหรับฉัน:

var viewHasAppeared = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if !viewHasAppeared { goToBottom() }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    viewHasAppeared = true
}

private func goToBottom() {
    guard data.count > 0 else { return }
    let indexPath = NSIndexPath(forRow: data.count - 1, inSection: 0)
    tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: false)
    tableView.layoutIfNeeded()
}

กุญแจเปิดออกเพื่อไม่ห่อscrollToRowAtIndexPathด้านในของdispatch_asyncที่บางคนได้แนะนำ แต่เพียงทำตามมันด้วยการโทรไปlayoutIfNeededแต่เพียงต่อไปด้วยการเรียกร้องให้

ความเข้าใจของฉันเกี่ยวกับเรื่องนี้คือการเรียกวิธีการเลื่อนในเธรดปัจจุบันรับประกันว่าการตั้งค่าการเลื่อนถูกตั้งค่าทันทีก่อนที่จะแสดงมุมมอง เมื่อฉันส่งไปยังเธรดหลักมุมมองจะปรากฏขึ้นทันทีก่อนที่การเลื่อนจะมีผล

(นอกจากนี้ NB คุณต้องการviewHasAppearedแฟล็กเนื่องจากคุณไม่ต้องการให้goToBottomทุกครั้งviewDidLayoutSubviewsถูกเรียกมันถูกเรียกเช่นเมื่อใดก็ตามที่การวางแนวเปลี่ยนไป)


3

เมื่อใช้วิธีแก้ไขปัญหาข้างต้นสิ่งนี้จะเลื่อนไปที่ด้านล่างของตารางของคุณ (เฉพาะเมื่อโหลดเนื้อหาของตารางก่อน):

//Scroll to bottom of table
CGSize tableSize = myTableView.contentSize;
[myTableView setContentOffset:CGPointMake(0, tableSize.height)];


2

หากคุณต้องโหลดข้อมูลแบบอะซิงโครนัสก่อนเลื่อนลงนี่คือวิธีแก้ปัญหาที่เป็นไปได้:

tableView.alpha = 0 // We want animation!
lastMessageShown = false // This is ivar

viewModel.fetch { [unowned self] result in
    self.tableView.reloadData()

    if !self.lastMessageShown {
        dispatch_async(dispatch_get_main_queue()) { [unowned self] in
            if self.rowCount > 0 {
                self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: self.rowCount, inSection: 0), atScrollPosition: .Bottom, animated: false)
            }

            UIView.animateWithDuration(0.1) {
                self.tableView.alpha = 1
                self.lastMessageShown = true // Do it once
            }
        }
    }
}

2

ฟังก์ชั่นที่รวดเร็ว 3เลื่อนไปด้านล่าง

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(false)
        //scroll down
        if lists.count > 2 {
            let numberOfSections = self.tableView.numberOfSections
            let numberOfRows = self.tableView.numberOfRows(inSection: numberOfSections-1)
            let indexPath = IndexPath(row: numberOfRows-1 , section: numberOfSections-1)
            self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: true)
        }
    }

2
func scrollToBottom() {

    let sections = self.chatTableView.numberOfSections

    if sections > 0 {

        let rows = self.chatTableView.numberOfRows(inSection: sections - 1)

        let last = IndexPath(row: rows - 1, section: sections - 1)

        DispatchQueue.main.async {

            self.chatTableView.scrollToRow(at: last, at: .bottom, animated: false)
        }
    }
}

คุณควรเพิ่ม

DispatchQueue.main.async {
            self.chatTableView.scrollToRow(at: last, at: .bottom, animated: false)
        }

มิฉะนั้นจะไม่เลื่อนไปด้านล่าง


2

ใช้รหัสง่าย ๆ นี้เพื่อเลื่อนดูตารางด้านล่าง

NSInteger rows = [tableName numberOfRowsInSection:0];
if(rows > 0) {
    [tableName scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:rows-1 inSection:0]
                     atScrollPosition:UITableViewScrollPositionBottom
                             animated:YES];
}

1
นี่เป็นสิ่งที่ OP กล่าวว่าเขาได้ลองไปแล้ว คำตอบนี้ไม่ได้ตอบคำถามของ OP เกี่ยวกับวิธีทำให้มันทำงานอย่างถูกต้องใน viewWillAppear
jk7

2

ขอบคุณยาโคบสำหรับคำตอบ มีประโยชน์จริงๆถ้าใครสนใจกับ monotouch รุ่น c #

private void SetScrollPositionDown() {
    if (tblShoppingListItem.ContentSize.Height > tblShoppingListItem.Frame.Size.Height) {
        PointF offset = new PointF(0, tblShoppingListItem.ContentSize.Height - tblShoppingListItem.Frame.Size.Height);
        tblShoppingListItem.SetContentOffset(offset,true );
    }
}

1

ใน iOS มันใช้งานได้ดีสำหรับฉัน

CGFloat height = self.inputTableView.contentSize.height;
if (height > CGRectGetHeight(self.inputTableView.frame)) {
    height -= (CGRectGetHeight(self.inputTableView.frame) - CGRectGetHeight(self.navigationController.navigationBar.frame));
}
else {
    height = 0;
}
[self.inputTableView setContentOffset:CGPointMake(0, height) animated:animated];

จะต้องมีการเรียกจาก viewDidLayoutSubviews


1

[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) เคลื่อนไหว: ใช่


1

คำตอบที่ยอมรับนั้นใช้ไม่ได้กับตารางของฉัน (หลายพันแถวโหลดแบบไดนามิก) แต่โค้ดด้านล่างใช้ได้:

- (void)scrollToBottom:(id)sender {
    if ([self.sections count] > 0) {
        NSInteger idx = [self.sections count] - 1;
        CGRect sectionRect = [self.tableView rectForSection:idx];
        sectionRect.size.height = self.tableView.frame.size.height;
        [self.tableView scrollRectToVisible:sectionRect animated:NO];
    }
}

1

ไม่จำเป็นต้องมีการเลื่อนใด ๆ ที่คุณสามารถทำได้โดยใช้รหัสนี้:

[YOURTABLEVIEWNAME setContentOffset:CGPointMake(0, CGFLOAT_MAX)];

1

หากคุณกำลังตั้งค่าเฟรมสำหรับ tableview โดยทางโปรแกรมตรวจสอบให้แน่ใจว่าคุณตั้งค่าเฟรมอย่างถูกต้อง


0

ใน Swift คุณแค่ต้องการ

self.tableView.scrollToNearestSelectedRowAtScrollPosition(UITableViewScrollPosition.Bottom, animated: true)

เพื่อให้เลื่อนไปที่ก้นโดยอัตโนมัติ


0

ใน swift 3.0 หากคุณต้องการไปที่เซลล์ใด ๆ ของ Tableview เปลี่ยนค่าดัชนีเซลล์เช่นเปลี่ยนค่า "self.yourArr.count"

self.yourTable.reloadData()
self.scrollToBottom() 
func scrollToBottom(){
    DispatchQueue.global(qos: .background).async {
        let indexPath = IndexPath(row: self.yourArr.count-1, section: 0)
        self.tblComment.scrollToRow(at: indexPath, at: .bottom, animated: true)
    }
}

0

ฉันเชื่อว่าวิธีแก้ไขปัญหาแบบเก่าไม่สามารถทำงานกับ swift3 ได้

หากคุณรู้จำนวนแถวในตารางคุณสามารถใช้:

tableView.scrollToRow(
    at: IndexPath(item: listCountInSection-1, section: sectionCount - 1 ), 
    at: .top, 
    animated: true)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.