Swift에서 Int를 기반으로 UITableView의 특정 행 새로 고침


88

저는 Swift의 초보 개발자이며 UITableView를 포함하는 기본 앱을 만들고 있습니다. 다음을 사용하여 테이블의 특정 행을 새로 고치고 싶습니다.

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

그리고 새로 고칠 행을 rowNumber라는 Int에서 가져오고 싶습니다.

문제는이 작업을 수행하는 방법을 모르고 검색 한 모든 스레드가 Obj-C에 대한 것입니다.

어떤 아이디어?


섹션이 하나뿐입니까?
Lyndsey Scott 2015

답변:


195

NSIndexPath행과 섹션 번호를 사용하여 생성 한 다음 다음과 같이 다시로드 할 수 있습니다.

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

이 예에서는 테이블에 하나의 섹션 (예 : 0) 만 있다고 가정했지만 그에 따라 해당 값을 변경할 수 있습니다.

Swift 3.0 업데이트 :

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

특정 섹션의 행 수가 변경되면? @Lyndsey 스콧

@Lyndsey : 실제로 처음에는 내가 다시로드 할 섹션에 2 개의 셀이 있다고 가정 해 보겠습니다. 다시로드 한 후 해당 특정 섹션에 (x) 개의 셀이있을 것이라고 말하겠습니다. 그래서 제 질문은 indexpath 계산, 섹션에 대해 확실하지만 행 수 변경시 충돌하므로 행 수에 대해 혼란 스럽습니다. var indexPath = NSIndexPath (forRow : rowNumber, inSection : 0)
dip

@dip 당신은 당신의 tableView : numberOfRowsInSection : 그 정보를 얻기 위해 방법 알고리즘을 봐야합니다 ... 당신의 코드와 관련된 특정 문제처럼 들리기 때문에 포럼에 질문을 게시하는 것이 좋습니다.
Lyndsey 스콧

이 메서드를 어디에서 호출할까요?
Master AgentX 2019

22

소프트 임팩트 애니메이션 솔루션의 경우 :

스위프트 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)

앱이 충돌하지 않도록 보호하는 또 다른 방법입니다.

스위프트 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)
   }
}

4

스위프트 4

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

2

Swift 3.0에서

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

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

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

기본적으로 TableView에 섹션이 하나만있는 경우 섹션 값 0을 입력 할 수 있습니다.


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

1
안녕하세요, Stack Overflow에 오신 것을 환영합니다. 첫 번째 답변에 감사드립니다. 다른 사람들에게 더 유용한 답변을 제공하려면 OP의 원래 질문을 해결하는 이유를 설명하는 텍스트로 답변에 주석을 추가하는 것이 좋습니다.
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

또한 tableview에 대한 섹션 이있는 경우 새로 고치려는 모든 행을 찾으려고 시도해서는 안되며 섹션 다시로드를 사용해야합니다. 쉽고 균형 잡힌 프로세스입니다.

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

어때 :

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

0

스위프트 4.1

행의 selectedTag를 사용하여 행을 삭제할 때 사용합니다.

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

이 질문은 Swift에 대한 것임을 알고 있지만 누군가 관심이 있다면 허용되는 답변의 Xamarin에 해당하는 코드가 있습니다.

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()

나는 특정 상황에 처해 있었다. 내 주요 목표는 사용자가 셀에있을 때이를 달성하는 것이 었습니다. 그리고 나는 약간의 수정을가했습니다. 전체 테이블을로드하고 사용자를 혼란스럽게하지 않고 셀만 업데이트 할 수 있습니다. 이러한 이유로이 함수는 tableView 속성을 이용하여 사용자 지정 ReloadDataCell을 추가합니다. 그리고 tableview.reloadDataSavingSelecctions ()를 추가합니다. 어디에서 행동을 취하십시오. 그리고 나서 그 솔루션을 여러분과 공유하고 싶었습니다.
irwin B

그것을 편집하여 당신의 대답에 모든 설명을 추가하세요
니코 하세
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.