[iOS] selectat doar un rand dintr-o sectiune dintr-un tabel
  [ Ignoră ]
RankRankRank
Member
Din: Copenhaga
Macuser din: 20.02.10

Salut. Ma chinui cu o mica problema: am facut un chestionar sub forma de tabel. Am 6 intrebari cu cate 3 raspunsuri, dar utilizatorul trebuie sa aleaga doar un raspuns din cele trei.
Ca urmare, am facut 6 sectiuni, cu 3 randuri.
In momentul actual, pot sa selectez mai mult de un raspuns pentru o intrebare. Si nu imi dau seama cum sa fac sa fie doar o selectie pe sectiune.
Cam asa ceva as vrea sa fac:

- Sectia 0
  - Randul 0 √
  - Randul 1
- Secta 1
  - Randul 0
  - Randul 1 √
  - Randul 2

Si in momentul in care se razgandeste si vrea randul 0 din sectia 1, checkmark-ul sa se duca acolo si cel de pe randul 1 sa dispara.
Sper ca m-am facut inteles

 Semnătură 

Powerbook G4, 15”, 1.25 Ghz, 2 Gb Ram, ATI Mobility Radeon 9600
MacBook Pro 15” 2010, Intel i7,  2.66 Ghz, 4Gb Ram, Nvidia 330M

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Cel mai simplu ar fi sa ai un array de lungimea sectiunilor si sa stochezi ce linie ai selectat in fiecare sectiune. Inainte de a stoca valoarea asta scoti bifa de la linia care a fost stocata inaintea ei. Daca vrei sa si persiste modificarile poate e mai bine sa ai o proprietate in modelul fiecarei linii, daca ai asa ceva. Daca se modifica liniile cea selectata nu se pierde sau devine invalida.
Sper ca logica asta era singura ta problema

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 2 ]
RankRank
Jr. Member
Din: 
Macuser din: 06.03.09

Swift:
 
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
  if let selectedIndexPath = selectedRowInSection(indexPath.section) {
    // Deselect the selected row
    tableView.deselectRowAtIndexPath(selectedIndexPath, animated: false)
  }
  return indexPath
}

func selectedRowInSection(section: Int) -> NSIndexPath? {
  let selectedIndexPaths = tableView.indexPathsForSelectedRows()
  for indexPath in selectedIndexPaths {
    if indexPath.section == section {
      return indexPath
    }
  }
  return nil
}

Profil
 
  [ Ignoră ]   [ # 3 ]
RankRankRank
Member
Din: Copenhaga
Macuser din: 20.02.10

Multumesc de raspunsuri. Aparent am rezolvat-o, cred si sper asa: (e putin cam repetitiv codul, dar deocamdata la testari merge)

var lastIndexPath = NSIndexPath(forRow: 9, inSection: 9);

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
      print(“indexPath0: \(indexPath)”);
      print(“lastIndex0: \(lastIndexPath)”);
     
      let section = indexPath.section
      let oldSection = lastIndexPath.section;
      let row = indexPath.row;
      let oldRow = lastIndexPath.row;
      let newCell = tableView.cellForRowAtIndexPath(indexPath);
      let oldCell = tableView.cellForRowAtIndexPath(lastIndexPath);

      if (section == oldSection) {
        if (row != oldRow){
          newCell?.accessoryType = .Checkmark
          oldCell?.accessoryType = .None
          tableView.deselectRowAtIndexPath(lastIndexPath, animated: true);
          selectedSection[indexPath.section] = indexPath.section
        }
      } else {
        newCell?.accessoryType = .Checkmark;
        lastIndexPath = indexPath;
      }
     
      print(“indexPath1: \(indexPath)”);
      print(“lastIndex1: \(lastIndexPath)”);
  }

 Semnătură 

Powerbook G4, 15”, 1.25 Ghz, 2 Gb Ram, ATI Mobility Radeon 9600
MacBook Pro 15” 2010, Intel i7,  2.66 Ghz, 4Gb Ram, Nvidia 330M

Profil
 
  [ Ignoră ]   [ # 4 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Asta-i array-u de care ziceam eu? selectedSection[indexPath.section] = indexPath.section
Trebuie sa fie selectedSection[indexPath.section] = row

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 5 ]
RankRankRank
Member
Din: Copenhaga
Macuser din: 20.02.10

E asa cum ai zis, .ral:cr, ca mi-am dat si eu seama dupa ce am postat. Si am schimbat.
Intre timp, am descoperit un bug: daca selectez randul 1 din sectia 0, apoi randul 2 din sectia 1, cand ma intorc sa schimb selectia din sectia 0(exemplu randul 0), ramane selectat randul precedent din sectia respectiva, pentru lastIndexPath are sectia 1, randul 2.
Acum, toata chestia e pt proiectul de semestru la universitate. Si contez pe faptul ca oamenii cand vor vedea chestionarul, o sa selecteze in ordine, sau cel mult sa isi schimbe selectia in aceeasi sectiune, inainte de a se duce la cea noua.
Proiectul e un fel de Tinder pentru iesit la masa la cantina la facultate. Chestionarul e ca sa potrivim alti oameni cu tine in functie de interese.
Apropo, stie cineva daca e ceva similar pentru iOS: https://github.com/Yalantis/FlipViewPager.Draco

 Semnătură 

Powerbook G4, 15”, 1.25 Ghz, 2 Gb Ram, ATI Mobility Radeon 9600
MacBook Pro 15” 2010, Intel i7,  2.66 Ghz, 4Gb Ram, Nvidia 330M

Profil
 
  [ Ignoră ]   [ # 6 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Nu trebuie sa salvezi lastIndexPath, linia o ai deja salvata in array si apoi poti sa reconstruiesti NSIndexPath cu linia respectiva si sectiunea o iei din indexPathul curent.
NSIndexPath(forItem: selectedSection[indexPath.section], inSection: indexPath.section)

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 7 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Pentru a rezolva usor aceasta problema as fi utilizat UISegmentedControl pe acelasi row cu intrebarea !!

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 8 ]
RankRankRank
Member
Din: Copenhaga
Macuser din: 20.02.10

Intrebarea e header-ul sectiei din tabel.
Mi s-a mai sugerat sa foloesc un UISwitch.

 Semnătură 

Powerbook G4, 15”, 1.25 Ghz, 2 Gb Ram, ATI Mobility Radeon 9600
MacBook Pro 15” 2010, Intel i7,  2.66 Ghz, 4Gb Ram, Nvidia 330M

Profil
 
  [ Ignoră ]   [ # 9 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

UISwitch este on/off ( adica doua stari ) . Tu ai nevoie de mai multe .

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
   
 
 
‹‹ Xcode 7, sideload apps      Despre Unix ››