Swift'deki Int'e göre belirli UITableView satırını yenileyin


90

Swift'de yeni başlayan bir geliştiriciyim ve bir UITableView içeren temel bir uygulama oluşturuyorum. Tablonun belirli bir satırını şunu kullanarak yenilemek istiyorum:

self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)

ve yenilenecek satırın satırNumarası adlı bir Int olmasını istiyorum

Sorun şu ki, bunu nasıl yapacağımı bilmiyorum ve aradığım tüm konular Obj-C için.

Herhangi bir fikir?


Sadece bir bölüm var mı?
Lyndsey Scott

Yanıtlar:


198

NSIndexPathSatır ve bölüm numarasını kullanarak bir oluşturabilir ve ardından şu şekilde yeniden yükleyebilirsiniz:

let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

Bu örnekte, tablonuzun yalnızca bir bölümü (yani 0) olduğunu varsaydım, ancak bu değeri buna göre değiştirebilirsiniz.

Swift 3.0 Güncellemesi:

let indexPath = IndexPath(item: rowNumber, section: 0)
tableView.reloadRows(at: [indexPath], with: .top)

satırların belirli bölüm sayısı değiştirilecekse? @Lyndsey Scott
dip

@Lyndsey: Aslında ilk başta, o bölümde yeniden yükleyeceğim 2 hücrem olduğunu söyleyelim, yeniden yükledikten sonra o bölümde herhangi bir (x) hücre sayısına sahip olacağımı söyleyelim, bu yüzden sorum şu satırda dizin yolu hesaplaması, bölümden eminim ama satır sayısı konusunda kafam karıştı, çünkü satır sayısının değişmesi üzerine çöküyor var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
dip

@dip, tablonuza bakmanız gerekirView: numberOfRowsInSection: bu bilgiyi almak için yöntem algoritması ... Kodunuzla yaşadığınız belirli bir sorun gibi göründüğü için sorunuzu foruma göndermenizi öneririm ...
Lyndsey Scott

Bu yöntemi nereden çağırmalı?
Master AgentX

22

Yumuşak etkili bir animasyon çözümü için:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
tableView.reloadRows(at: [indexPath], with: .fade)

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Bu, uygulamanın çökmesini önlemenin başka bir yoludur:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
    if visibleIndexPaths != NSNotFound {
        tableView.reloadRows(at: [indexPath], with: .fade)
    }
}

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.indexOf(indexPath) {
   if visibleIndexPaths != NSNotFound {
      tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
   }
}

3

Swift 3.0'da

let rowNumber: Int = 2
let sectionNumber: Int = 0

let indexPath = IndexPath(item: rowNumber, section: sectionNumber)

self.tableView.reloadRows(at: [indexPath], with: .automatic)

byDefault, TableView'da yalnızca bir bölümünüz varsa, bölüm değeri 0 koyabilirsiniz.


3

Swift 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

Cevabımı neden kopyalayıp yapıştırıyorsun?
Hardik Thakkar

2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

1
Merhaba, Stack Overflow'a hoş geldiniz ve ilk cevabınız için teşekkür ederiz. Cevabı başkaları için daha yararlı hale getirmek için, cevabınıza, neden OP'nin orijinal sorusuna yanıt verdiğini açıklayan bir metin eklemek en iyi uygulamadır.
Spangen

2

SWIFT 4.2

    func reloadYourRows(name: <anyname>) {
    let row = <your array name>.index(of: <name passing in>)
    let reloadPath = IndexPath(row: row!, section: 0)
    tableView.reloadRows(at: [reloadPath], with: .middle)
    }

1

Ayrıca tablo görünümü için bölümleriniz varsa , yenilemek istediğiniz her satırı bulmaya çalışmamalısınız, bölümleri yeniden yüklemelisiniz. Kolay ve dengeli bir süreçtir:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Peki ya:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)

0

Swift 4.1

satırın selectedTag'ini kullanarak satırı sildiğinizde kullanın.

self.tableView.beginUpdates()

        self.yourArray.remove(at:  self.selectedTag)
        print(self.allGroups)

        let indexPath = NSIndexPath.init(row:  self.selectedTag, section: 0)

        self.tableView.deleteRows(at: [indexPath as IndexPath], with: .automatic)

        self.tableView.endUpdates()

        self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)

0

Bu sorunun Swift için olduğunun farkındayım, ancak burada birisi ilgileniyorsa kabul edilen cevabın Xamarin eşdeğer kodu.

var indexPath = NSIndexPath.FromRowSection(rowIndex, 0);
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);

0
    extension UITableView {
        /// Reloads a table view without losing track of what was selected.
        func reloadDataSavingSelections() {
            let selectedRows = indexPathsForSelectedRows

            reloadData()

            if let selectedRow = selectedRows {
                for indexPath in selectedRow {
                    selectRow(at: indexPath, animated: false, scrollPosition: .none)
                }
            }
        }
    }

tableView.reloadDataSavingSelections()

Kendimi belirli bir durumda buldum. Benim asıl amacım, kullanıcı bir hücrede olduğunda bunu başarmaktı. Ve bazı değişiklikler yaptım. Tüm tabloyu yüklemeden ve kullanıcının kafasını karıştırmadan yalnızca içinde bulunduğu hücreyi güncelleyebilirsiniz. Bu nedenle, bu işlev özel bir ReloadDataCell ekleyerek tableView özelliklerinden yararlanır. Ve tableview.reloadDataSavingSelecctions () ekleniyor. Nerede, biraz hareket yaparsın. Ve bir kez yaptım, bu çözümü sizinle paylaşmak istedim.
irwin B

Lütfen yanıtınıza tüm açıklamaları düzenleyerek ekleyin
Nico Haase
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.