2016-03-19 16 views
0

UIPickerView'ı hangi dizinin doldurması gerektiğine karar vermek için bir anahtar deyimi kullanmak amacıyla UISegmentedControl uygulamak için bir UISegmentedControl uygulamaya çalıştım, ancak hızlı bir şekilde yazılan bu yaklaşım beklendiği gibi çalışmadı. Bu problemi daha önce kimsenin keşfettiği ya da bu işlevlerin birlikte nasıl çalışabileceği konusunda herhangi bir fikri olabilir mi? İşte UIPickerView Etiketlerini değiştirmek için UISegmentedControl kullanma

bugüne kadar kodudur:

import UIKit 


class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    var rejuvenatedEnterprisesEmployees = [ 
     Employees(name: "Jeffrey Wells", employeeRoles: ["Accountant", "Designer"], departmentID: 0), 
     Employees(name: "Victor Atkins", employeeRoles: ["Director of IT", "Sales Stategist"], departmentID: 0), 
     Employees(name: "Kelli Hamilton", employeeRoles: ["Director of Sales"], departmentID: 0), 
     Employees(name: "Adam Braun", employeeRoles: ["Sales Lead"], departmentID: 1), 
     Employees(name: "Brian Cruz", employeeRoles: ["Designer"], departmentID: 1), 
     Employees(name: "Kristen Floyd", employeeRoles: ["Developer"], departmentID: 1), 
     Employees(name: "Lois Martinez", employeeRoles: ["Curator", "Blogger"], departmentID: 2), 
     Employees(name: "Michael Lind", employeeRoles: ["Sales, Administrator"], departmentID: 2), 
     Employees(name: "Eric Bay", employeeRoles: ["Database Admin"], departmentID: 2), 
     Employees(name: "Brandon Young", employeeRoles: ["Artist"], departmentID: 2) 
    ] 
    var rejuvenatedEnterprisesVictorsEmployees = [ 
     Employees(name: "Victor Atkins", employeeRoles: ["Director of IT", "Sales Stategist"], departmentID: 0), 
     Employees(name: "Adam Braun", employeeRoles: ["Sales Lead"], departmentID: 1), 
     Employees(name: "Brian Cruz", employeeRoles: ["Designer"], departmentID: 1), 
     Employees(name: "Kristen Floyd", employeeRoles: ["Developer"], departmentID: 1) 
    ] 
    var rejuvenatedEnterprisesKellisEmployees = [ 
     Employees(name: "Kelli Hamilton", employeeRoles: ["Director of Sales"], departmentID: 0), 
     Employees(name: "Lois Martinez", employeeRoles: ["Curator", "Blogger"], departmentID: 2), 
     Employees(name: "Michael Lind", employeeRoles: ["Sales, Administrator"], departmentID: 2), 
     Employees(name: "Eric Bay", employeeRoles: ["Database Admin"], departmentID: 2), 
     Employees(name: "Brandon Young", employeeRoles: ["Artist"], departmentID: 2) 
    ] 
    var squaredEnterprisesEmployees: [String] = ["Jeffrey Wells","Victor Atkins","Kelli Hamilton","Adam Braun","Brian Cruz","Kristen Floyd","Lois Martinez","Michael Lind","Eric Bay","Brandon Young"] 

    //UIPicker Scroll component 
    let kManagerScrollComponentCount: Int = 1 
    let kManagerScrollComponent: Int = 0 
    //UIPicker Scroll component 

    var chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 

    @IBOutlet weak var employeeListing: UITextView! 
    @IBOutlet weak var userTicketLocation: UILabel! 
    @IBAction func addEmployee(sender: AnyObject) { 


    } 

    @IBOutlet weak var segmentedControl: UISegmentedControl! 
    @IBAction func indexChanged(sender: UISegmentedControl) { 
     switch segmentedControl.selectedSegmentIndex 
     { 
     case 0: 
      func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) ->UIView { 
       //var chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 
       chosenManagerScrollView.backgroundColor = UIColor.clearColor() 
       var jumperCables: [String] = [] 
       for var i = 0; i < rejuvenatedEnterprisesEmployees.count ; ++i { 
        jumperCables.append(rejuvenatedEnterprisesEmployees[i].name) 
       } 
       chosenManagerScrollView.text = jumperCables[row] 
       return chosenManagerScrollView 
      } 
     case 1: 
      func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) ->UIView { 
       //var chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 
       chosenManagerScrollView.backgroundColor = UIColor.greenColor() 
       var jumperCablez: [String] = [] 
       for var i = 0; i < rejuvenatedEnterprisesVictorsEmployees.count ; ++i { 
        jumperCablez.append(rejuvenatedEnterprisesVictorsEmployees[i].name) 
       } 
       chosenManagerScrollView.text = jumperCablez[row] 
       return chosenManagerScrollView 
      } 
     default: 
      break; 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return kManagerScrollComponentCount 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return rejuvenatedEnterprisesEmployees.count 
    } 


    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) ->UIView { 

     switch segmentedControl.selectedSegmentIndex 
     { 
     case 0: 
       let chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 
       chosenManagerScrollView.backgroundColor = UIColor.clearColor() 
       var jumperCables: [String] = [] 
       for var i = 0; i < rejuvenatedEnterprisesEmployees.count ; ++i { 
        jumperCables.append(rejuvenatedEnterprisesEmployees[i].name) 
       } 
       chosenManagerScrollView.text = jumperCables[row] 
       return chosenManagerScrollView 
     case 1: 
       let chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 
       chosenManagerScrollView.backgroundColor = UIColor.greenColor() 
       var jumperCablez: [String] = [] 
       for var i = 0; i < rejuvenatedEnterprisesVictorsEmployees.count ; ++i { 
        jumperCablez.append(rejuvenatedEnterprisesVictorsEmployees[i].name) 
       } 
       chosenManagerScrollView.text = jumperCablez[row] 
       return chosenManagerScrollView 
     default: 
      print("done") 
      let chosenManagerScrollView: UILabel = UILabel(frame: CGRectMake(40,0,170,72)) 
      chosenManagerScrollView.backgroundColor = UIColor.clearColor() 
      var jumperCables: [String] = [] 
      for var i = 0; i < rejuvenatedEnterprisesEmployees.count ; ++i { 
       jumperCables.append(rejuvenatedEnterprisesEmployees[i].name) 
      } 
      chosenManagerScrollView.text = jumperCables[row] 
      return chosenManagerScrollView 

     } 
    } 



    func displayEmployeeGroup(chosenEmployee: String, fromComponent chosenComponent: String) { 

     switch chosenEmployee { 
      case chosenEmployee where chosenEmployee == "Jeffrey Wells": 
       for employee in rejuvenatedEnterprisesEmployees { 
        print(employee) 
        employeeListing.text = "\(employee)\n" 
      } 
      case chosenEmployee where chosenEmployee == "Victor Atkins": 
      break 

      case chosenEmployee where chosenEmployee == "Kelli Hamilton": 
      break 

     default: print("done") 
     } 
     if chosenEmployee == "Jeffrey Wells" { 
      for employee in rejuvenatedEnterprisesEmployees { 
       print(employee) 
       employeeListing.text = "\(employee)\n" 
      } 
     } 
    } 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     let chosenEmployee: Int = pickerView.selectedRowInComponent(kManagerScrollComponent) 
     displayEmployeeGroup(squaredEnterprisesEmployees[chosenEmployee], fromComponent: "the list of employees") 
    } 




    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 
+0

Evet, bölümlere ayrılmış denetim UIPickerView öğesini sınıfın en üstünde oluşturulan diziyle güncelleştirmiyor. –

+0

Evet, teşekkürler, nedenini anlıyorum. – matt

cevap

2

Sen anlamadınız nasıl veri kaynağı/temsilci mesajlaşma çalışır. Bu kod öyle düşündüğün yapmaz: sihirli bu fonksiyon veri kaynağı viewForRow yöntem olmasına neden olmayacak

case 0: 
    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) ->UIView { 

. Sadece yerel işlevini tanımlar ve yerel işlevini sunar ve anında sıfırdan kaybolur. Görünüm denetleyicinizin üst düzeyindeki viewForRow'u diğer tüm yöntemleriniz gibi uygulamalısınız. , seçilen segmente göre seçim yapmalıdır. (Aslında bunu önceden ayarladığınızı düşünüyorum.) Segmente edilen denetim, değeri değiştiğinde, yalnızca seçici görünümün yeniden yüklenmesini söyler (ör. reloadAllComponents) ve böylece yeniden çağrılacak viewForRow neden olur.

+0

tamamen anlaşılabilir ve bunun için teşekkür ederim. Bu yaklaşım sırasında, segmentli kontrol anahtarı bildirimini viewForRow yönteminin içine uygulayabilir miyim? Ne dediğimi anlamlandırıyor mu? –

+1

Bunu zaten yaptınız. Bu kod, muhtemelen genel yapısının ötesine bakmamış olmama rağmen iyi. – matt

+0

Teşekkürler @matt, viewForRow yöntemini UISegmentedControl IBAction yönteminin içinden kaldırmayı mı öneriyorsunuz? Eğer öyleyse, seçilen UISegmentControl'ü temel alarak UIPickerView'i güncellemek için bu fonksiyonu nasıl tetikleriz? –