W VC # 1 mam UITableView. Kiedy dotknę komórki, doprowadzam do VC # 2, gdzie wyświetlane są informacje o tej komórce.

Chcę być w stanie nacisnąć przycisk w VC # 2, który zmienia tytuł komórki odpowiadają w VC # 1, ale jestem zdezorientowany, jak to zrobić?

Czy powinienem utworzyć zmienną w VC # 2, aby zapisać indexPath dla żądanej komórki, a następnie zadzwoń do funkcji w VC # 1 z VC # 2, który używa tego indexAT do aktualizacji komórki? Gdybym to zrobił, nie będziesz musiał być statycznym, więc wiem, że modyfikuję odpowiednią instancję VC # 1? Używam Segui Push i kontrolera nawigacji, aby wrócić, więc tworzenie nowej instancji VC # 1 nie odnosi się do tego samego VC, który próbuje zmodyfikować, jak wierzę?

Czy jest na to łatwiejszy sposób?

3
Brejuro 29 styczeń 2018, 19:38

4 odpowiedzi

Najlepsza odpowiedź

Powinieneś użyć wzoru delegata.

VC1 powinien wiedzieć, która komórka pokazuje VC2. Powinieneś mieć nieruchomość IndexPath w VC1, które przechowuje komórkę, która jest aktualnie wyświetlana w VC2, prawda?

Teraz utworzyć protokół o nazwie VC2Delegate:

protocol VC2Delegate : class {
    func titleDidChange(_ vc2: VC2, to title: String)
}

Teraz dodaj tę nieruchomość w VC2:

weak var delegate: VC2Delegate?

Teraz, gdy myślisz, że tytuł komórki powinien się zmienić, zadzwoń do delegata:

delegate?.titleDidChange(self, to: "Some Title")

To wszystko dla VC2.

Sprawić, aby VC1 jest zgodny z VC2Delegate:

extension VC1: VC2Delegate {
    func titleDidChange(_ vc2: VC2, to title: String) {
        // set the text of the table cell here...
    }
}

Teraz, gdy przekazywasz dane do VC2 z VC1, prawdopodobnie w metodzie prepareForSegue

vc2.delegate = self

Dowiedz się więcej o delegatach Tutaj.

3
Sweeper 29 styczeń 2018, 16:49

Możesz przekazać wszystkie dane, które chcesz przejrzeć kontrolery za pomocą Delegatów

najpierw utwórz protokół, co chcesz

protocol ViewControllerDelegate {

   func getSelected(value:Int)

}

Utwórz zmienną ze swojego ViewController, który chcesz przekazać dane

var delegate: ViewControllerDelegate?

na metodzie DiłaSelektrowat zrobisz

if delegate != nil {
   delegate.getSelected(value: indexPath.row)
}

self.navigationController?.popViewController(animated: true)

na ViewController, który otrzyma dane, które musisz zrobić, aby to zrobić

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

   if let vc = segue.destination as? SecondViewController {

      vc.delegate = self

   }

}

extension YourViewController: ViewControllerDelegate {

   fun getSelected(value:Int) {

      // Get value from another view controller and manage it

   } 

}

Ten kod jest w SWIFT 4

Jeśli nie rozumiesz czegoś, daj mi znać

1
jlima 29 styczeń 2018, 17:01

To złe podejście, które ścigasz. Musisz oddzielić warstwę danych z warstwy prezentacyjnej. Tak więc w VC # 2 edytujesz wizualizowane dane, a następnie VC # 1 Przeładuje dane, aby zaktualizować swój widok.

0
Shebuka 29 styczeń 2018, 16:44

Krótka odpowiedź: W ogóle nie powinieneś tego robić.

Kontrolery widoku nie powinny modyfikować innych widoków kontrolera widoku.

Należy zmodyfikować model danych w VC2, a następnie wysłać wiadomość z powrotem do VC1, mówiąc, aby zaktualizować komórkę.

(W Segue Push można skonfigurować VC1 do delegatu VC2, a następnie zdefiniuj protokół, który VC2 używa do powiadomienia VC1 o indexPath jest modelu danych, który należy zaktualizować.)

0
Duncan C 29 styczeń 2018, 16:51