首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理Tableview中的开关

处理Tableview中的开关
EN

Stack Overflow用户
提问于 2016-07-28 18:40:28
回答 1查看 278关注 0票数 1

我有一个屏幕,如下所示:

我按照您看到的使用自定义单元格上载了带有学生名称的列表,我希望当单击“保存”按钮保存数组中的学生的状态时,我第一次为所有学生初始化为0的数组,并且当启用了开关状态时,单击单元格索引处的这个值转换为1,但我无法确定,当单击开关时,只有在单击单元格(行)时才能进行相同的操作,当只更改切换状态以更新数组时,而不单击表中的完整行时,如何进行相同的操作?

主要视图代码:

代码语言:javascript
运行
复制
 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)


}




}

细胞代码:

代码语言:javascript
运行
复制
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) {
}

}

更新:

主视图控制器:

代码语言:javascript
运行
复制
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)")

}

}

代码语言:javascript
运行
复制
protocol CellInfoDelegate {
func processThatNumber(theStatus: String)
 }

单元视图控制器:

代码语言:javascript
运行
复制
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) {
}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-28 20:25:47

有几种方法可以做到这一点:使用closuredelegate,但我更喜欢使用delegate

  1. 为您的teacherAttendanceCell单元格创建一个teacherAttendanceCell,如下面的答案https://stackoverflow.com/a/25792213/2739795中所示
  2. 使您的teacherAttendanceVC符合delegate
  3. 每次cellForRowAtIndexPath调用都会设置cell.delegate = self。还将单元格返回到委托方法中。
  4. stateChanged内部委托调用方法
  5. 当委托方法调用时,如果切换单元格,则可以获得索引。
代码语言:javascript
运行
复制
tableView.indexPathForCell(cellFromParam)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38644350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档