如何在TableViewCell中达到更改的值

时间:2015-10-26 21:23:16

标签: ios swift uitableview uiviewcontroller tableviewcell

我在Swift方面经验不足。我有一个tableView和自定义单元格,其中有几个标签,UISlider和UISwitch。 当我更改滑块值并点击提交(条形按钮项)时,我想从所有单元格中收集UISlider和UISwitch值。
我尝试了什么:
1.Tags:我到达了一些细胞,但停了下来,无法到达目前看不见的细胞,最后读了一些意见,标签不太可能使用。
问题:有没有明确的反对意见?
2.CellForRowAtIndexPath:

CREATE PROCEDURE my_Proc
  @EID         VARCHAR(20) = NULL
,@DateFilter   DATE        = NULL
AS
BEGIN
  SET NOCOUNT ON;
  Declare @Sql NVARCHAR(MAX);

SET @Sql = N'select [various things] 
            from [table] 
            where record_locator IS NOT NULL '
         + CASE WHEN @EID IS NOT NULL 
           THEN N' AND eid = @EID ' ELSE N''END
         + CASE WHEN  @DateFilter IS NOT NULL
           THEN N' AND end_dt >= Dateadd(m, Datediff(m, 0, Dateadd(m, -1, current_timestamp)), 0)'
                ELSE N'' END

          + N' order by a.end_date;'

 Exec sp_executesql @Sql
                   ,N'@EID VARCHAR(20)'
                   ,@EID
END

我是否理解正确,我在这里调用了cellForRowAtIndexPath,难怪我得到了Custom Cell的新实例(由函数处理)?

3。"摇尾巴" 不幸的是,我已经失去了讨论这个解决方案的SO链接:(
我试图使用.superview.superview来到达UIViewController ......但是Xcode拒绝吃4个超级视图(我不确定我找到了正确的.superviews数量)。

主要思想是在Custom Cell中提供对UIViewController属性的访问:

在CustomTableViewCell中添加一个属性:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell") as! CustomTableViewCell 
cell.Label1.text = "Long Tongue, size \(indexPath.row) cm"
cell.Label2.text = "Big Banana, size \(indexPath.row) inches"
return cell
}

    @IBAction func submitTapped(sender: AnyObject) {       
let cell = tableView(self.tableView , cellForRowAtIndexPath: NSIndexPath(forRow: 1, inSection: 0)) as! CustomTableViewCell
print(cell.Label1.text) //  gives me 
print(cell.Label2.text) //   values

print(cell.customSlider.value)  // gives me the value stated as  
print(cell.customSwitch.on)     // default
}

好消息,这个有效!
问题:有没有任何方法可以“w w w dog dog dog dog并从UIViewController到达Custom Cell?

1 个答案:

答案 0 :(得分:1)

看看你的解决方案我认为你会遇到一个问题,因为单元格正在保持对viewController的引用,因此会导致内存泄漏。你应该使用"弱var viewController:MyViewController?"如果你打算沿着这条路走下去

然而,正如亚马所说,你不应该这样做。最好使用此数据更新模型。您可能能够将数据直接传递给单元格以修改数据,但我不知道数据的格式,因此您可以创建一个委托来从单元格传回值。一个例子是:

protocol CustomTableViewCellDelegate: class {
    func didChangeSlider(value: Float, cellNo: Int)
    //func didSwitchOn(value: Bool, cellNo: Int)
}

然后您可以将其添加到您的单元格中,如下所示:

class CustomTableViewCell: UITableViewCell {        
weak var delegate: CustomTableViewCellDelegate?
var cellNo = 0
//and so on
}

然后在这里使用委托:

@IBAction func sliderValueChanged(sender: AnyObject) {
    self.delegate?.didChangeSlider(self.customSlider.value, cellNo)
}

最后,在创建单元格时,在ViewController中,您需要执行以下操作:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell") as! CustomTableViewCell 
cell.Label1.text = "Long Tongue, size \(indexPath.row) cm"
cell.Label2.text = "Big Banana, size \(indexPath.row) inches"
cell.delegate = self
cell.cellNo = indexPath.row
return cell
}

在ViewController的末尾添加,添加委托处理程序:

extension MyViewController: CustomTableViewCellDelegate {
func didChangeSlider(value: Float, cellNo: Int) {
//Save your value here
}
}