2016-07-28 9 views
0

habe ich einen Bildschirm wie das folgende Bild: enter image description hereUmgang mit Schalter in einer Tabellen- bei schnellen 2.2

I Liste mit Namen mithilfe von benutzerdefinierten Zelle Schüler hochgeladen wie Sie sehen, und ich will, wenn Klick auf den Button speichern Sie die status des schülers in array, ich initialisierte array mit 0 für alle schüler zum ersten mal und wenn der status von switch aktiviert ist, dann wurde dieser wert am clicked cell index in 1 umgewandelt, aber ich konnte das nicht machen, als die click-aktion passiert ist Schalten Sie dies jetzt nur passiert, wenn Sie auf die Zelle (Zeile) klicken, wie ich das gleiche tun kann, wenn nur den Status des Schalters ändern, um das Array zu aktualisieren, ohne auf Zeile bei

Code of Hauptansicht:

import UIKit 

class teacherAttendanceVC: UIViewController , UITableViewDataSource,UITableViewDelegate { 



@IBOutlet weak var studentlistTable: UITableView! 

@IBOutlet weak var loadIndicator: UIActivityIndicatorView! 


var username:String? 
var classID: String? 
var branchID: String? 

var normal_id = [String]() 
var student_name = [String]() 

var student_attendance = [String]() 





//Sent Data 
var n_id = "" 
var stu_name = "" 



@IBAction func backButton(sender: AnyObject) { 

    self.dismissViewControllerAnimated(true, completion: nil) 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    studentlistTable.delegate = self 
    studentlistTable.dataSource = self 


    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
    username = prefs.objectForKey("user")as! String 
    classID = prefs.objectForKey("ClassID")as! String 
    branchID = prefs.objectForKey("BranchID")as! String 




    self.loadIndicator.startAnimating() 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in 



     self.loadList() 


     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.loadIndicator.stopAnimating() 
      self.studentlistTable.reloadData() 


     }) 
    }); 


} 


override func viewDidAppear(animated: Bool) { 

} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return normal_id.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    //This method to define each cell at Table View 

    let cell = self.studentlistTable.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! teacherAttendanceCell 



    cell.studentNameLabel.text = student_name[indexPath.row] 


    return cell 
} 


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    // Get Cell Label 
    let currentCell = studentlistTable.cellForRowAtIndexPath(indexPath) as! teacherAttendanceCell! 

    student_attendance[indexPath.row] = currentCell.status 


} 





@IBAction func saveButton(sender: AnyObject) { 
    print(student_attendance) // this only to ensure from the final array before sending to server 
} 


func loadList() 
{ 
    var normallink = "myurl" 
    normallink = normallink + "?classid=" + self.classID! + "&branchid=" + self.branchID! 

    print(normallink) 

    var studentParentURL:NSURL = NSURL (string: normallink)! 
    let data = NSData(contentsOfURL: studentParentURL)! 



    do { 
     let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) 

     if let alldata = json["data"] as? [[String: AnyObject]] { 
      for onedata in alldata { 
       if let no_id = onedata["id"] as? String { 
        normal_id.append(no_id) 
       } 
       if let s_name = onedata["studentName"] as? String { 
        student_name.append(s_name) 
       } 




      } 
     } 
    } catch { 
     print("Error Serializing JSON: \(error)") 
    } 

    if(normal_id.count != 0) 
    { 
     for i in 1...self.normal_id.count 
     { 
      self.student_attendance.append("0") 
     } 
    } 




    print(normal_id.count) 
    print(student_name.count) 


} 




} 

Handy-Code:

class teacherAttendanceCell: UITableViewCell { 

@IBOutlet weak var studentNameLabel: UILabel! 
@IBOutlet weak var attendSwitch: UISwitch! 

var status:String = "" 

override func awakeFromNib() { 
    super.awakeFromNib() 

    if(attendSwitch.on) 
    { 
     status = "1" 
     print("ON") 
    } 
    else{ 
     status = "0" 
     print("OFF") 

    } 

    attendSwitch.addTarget(self, action: "stateChanged:", forControlEvents: UIControlEvents.ValueChanged) 

} 


func stateChanged(switchState: UISwitch) { 
    if switchState.on { 
     status = "1" 
     print("ON") 
    } else { 
     status = "0" 
     print("OFF") 
    } 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

@IBAction func attendSwitchChanged(sender: AnyObject) { 
} 

} 

Aktualisiert:

Hauptansicht Controller:

import UIKit 

class teacherAttendanceVC: UIViewController , UITableViewDataSource,UITableViewDelegate,CellInfoDelegate { 



@IBOutlet weak var studentlistTable: UITableView! 

@IBOutlet weak var loadIndicator: UIActivityIndicatorView! 


var username:String? 
var classID: String? 
var branchID: String? 

var normal_id = [String]() 
var student_name = [String]() 

var student_attendance = [String]() 





//Sent Data 
var n_id = "" 
var stu_name = "" 



@IBAction func backButton(sender: AnyObject) { 

    self.dismissViewControllerAnimated(true, completion: nil) 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    studentlistTable.delegate = self 
    studentlistTable.dataSource = self 


    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
    username = prefs.objectForKey("user")as! String 
    classID = prefs.objectForKey("ClassID")as! String 
    branchID = prefs.objectForKey("BranchID")as! String 





    self.loadIndicator.startAnimating() 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in 



     self.loadList() 



     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.loadIndicator.stopAnimating() 
      self.studentlistTable.reloadData() 


     }) 
    }); 


} 


override func viewDidAppear(animated: Bool) { 

} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return normal_id.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    //This method to define each cell at Table View 

    let cell = self.studentlistTable.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! teacherAttendanceCell 
    cell.delegate = self 




    cell.studentNameLabel.text = student_name[indexPath.row] 
    student_attendance[indexPath.row] = cell.status 


    //print(student_attendance.count) 
    //let currentCell = studentlistTable.cellForRowAtIndexPath(indexPath) as! teacherAttendanceCell! 
    // student_attendance.append(cell.status) 

    return cell 
} 


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    // Get Cell Label 
    // let currentCell = studentlistTable.cellForRowAtIndexPath(indexPath) as! teacherAttendanceCell! 

    // student_attendance[indexPath.row] = currentCell.status 
    //print("OK Status here!" + String(student_attendance.count)) 

} 





@IBAction func saveButton(sender: AnyObject) { 
    print(student_attendance) 
} 


func loadList() 
{ 
    var normallink = "mylinkhere" 
    normallink = normallink + "?classid=" + self.classID! + "&branchid=" + self.branchID! 

    print(normallink) 

    var studentParentURL:NSURL = NSURL (string: normallink)! 
    let data = NSData(contentsOfURL: studentParentURL)! 


    do { 
     let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) 

     if let alldata = json["data"] as? [[String: AnyObject]] { 
      for onedata in alldata { 
       if let no_id = onedata["id"] as? String { 
        normal_id.append(no_id) 
       } 
       if let s_name = onedata["studentName"] as? String { 
        student_name.append(s_name) 
       } 




      } 
     } 
    } catch { 
     print("Error Serializing JSON: \(error)") 
    } 

    if(normal_id.count != 0) 
    { 
     for i in 1...self.normal_id.count 
     { 
      self.student_attendance.append("0") 
     } 
    } 




    print(normal_id.count) 
    print(student_name.count) 

} 


func processThatNumber(theStatus: String) { 
    print("out : \(theStatus)") 

} 

}

protocol CellInfoDelegate { 
func processThatNumber(theStatus: String) 
} 

Handy-View-Controller:

import UIKit 

class teacherAttendanceCell: UITableViewCell{ 

@IBOutlet weak var studentNameLabel: UILabel! 
@IBOutlet weak var attendSwitch: UISwitch! 

var status:String = "" 
var delegate: CellInfoDelegate? 

override func awakeFromNib() { 
    super.awakeFromNib() 

    if(attendSwitch.on) 
    { 
     status = "1" 
     print("ON") 
    } 
    else{ 
     status = "0" 
     print("OFF") 

    } 

    attendSwitch.addTarget(self, action: "stateChanged:", forControlEvents: UIControlEvents.ValueChanged) 

} 


func stateChanged(switchState: UISwitch) { 
    if switchState.on { 
     status = "1" 
     print("ON") 
    } else { 
     status = "0" 
     print("OFF") 
    } 

    if let delegate = self.delegate { 
     delegate.processThatNumber(self.status) 
    } 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

@IBAction func attendSwitchChanged(sender: AnyObject) { 
} 

} 

Antwort

1

Es gibt nur wenige Möglichkeiten, dies zu tun: closure oder delegate, aber ich bevorzugte delegate zu verwenden.

  1. wie https://stackoverflow.com/a/25792213/2739795 in dieser Antwort eines delegate für Ihre teacherAttendanceCell Zelle erstellen

  2. Machen Sie teacherAttendanceVC das cell.delegate = selfdelegate

  3. Jedes Mal, wenn cellForRowAtIndexPath Anrufe eingestellt entsprechen. Auch geben die Zelle in Ihrem Delegatmethode

  4. Call-Methode von Delegierten innerhalb stateChanged

  5. Und wenn Delegat-Methode aufruft können Sie einen Index, wenn eingeschaltet Zelle

tableView.indexPathForCell(cellFromParam) 
+0

Ich aktualisiert meine Post , Ich bin nicht sehr vertraut mit der Verwendung von Protokoll in IOS, aber bis jetzt, als ich auf Speichern klicken, habe ich das gleiche alte Array mit Nullen aller Elemente, aber wenn ich Switch bin, kann ich Statuswert aus drucken Hauptansicht Controller durch Prot ocol, aber ich weiß nicht, wie und wo ich den Index der Zelle bekommen kann, um den Wert für dieses Element bei Array in der Hauptansicht Controller –

+0

zu ändern Ich löste mein Problem, wie Sie zuvor gesagt, und hängt von diesem Post, um praktische Schritte als zu nehmen Ich erwähnte, dass ich vorher nicht mit dem Protokoll beschäftigt habe. http://stackoverflow.com/questions/29913066/how-to-access-the-content-of-a-custom-cell-in-swift-using-button- Etikett –