我在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?
答案 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
}
}