Jam*_*mie 4 uitableview ios swift
我有一个UITableView定制组成UITableViewCells.在每个单元格中,有一个UILabel和一个UISlider.有人知道如何在其中一个滑块的值发生变化时,将滑块的新值从自定义UITableViewCell(在单独的文件中)发送到UITableViewController,以便我可以更新填充表的数组?
到目前为止,我最接近的是失败的黑客攻击:setSelected当滑块值发生变化时触发事件.虽然这突出了更改后的自定义单元格,但事件并未didSelectRowAtIndexPath在中获取UITableViewController.
杰米,提前谢谢你
您需要的是名为委托模式.
引自那里解释它是什么意思:
委托是一种简单而强大的模式,其中程序中的一个对象代表另一个对象或与另一个对象协同工作.委托对象保持对另一个对象(委托)的引用,并在适当的时间向其发送消息.该消息通知委托委托对象即将处理或刚刚处理的事件.委托可以通过更新应用程序中自身或其他对象的外观或状态来响应消息,并且在某些情况下,它可以返回影响即将发生的事件处理方式的值.委托的主要价值在于它允许您轻松自定义一个中心对象中多个对象的行为.
这些图表将帮助您了解发生了什么:
建筑:
操作:
现在关于如何实现它,这是你必须要做的.
用于Objective-C:
首先,创建你的委托方法UITableViewCell.让我们说出来ContactTableViewCell.
在您的ContactTableViewCell.h文件中,执行以下操作:
@protocol ContactCellDelegate <NSObject>
@required
-(void) didMoveSliderWithValue:(float) value;
@end
@interface ContactTableViewCell : UITableViewCell
@property (weak, nonatomic) id<ContactCellDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
现在使您的TableViewController符合此委托.让我们为您的VC命名MyTableViewController.
在MyTableViewController.h,执行此操作:
@interface MyTableViewController : UIViewController <ContactCellDelegate> //Use UITableViewController if you are using that instead of UIViewController.
Run Code Online (Sandbox Code Playgroud)
在您cellForRowAtIndexPath返回单元格之前,添加以下行:
cell.delegate = self;
Run Code Online (Sandbox Code Playgroud)
添加代理方法的实现INSIDE你的MyTableViewController.m.
-(void) didMoveSliderWithValue: (float) value
{
NSLog(@"Value is : %f",value);
//Do whatever you need to do with the value after receiving it in your VC
}
Run Code Online (Sandbox Code Playgroud)
现在让我们回到你的身边吧ContactTableViewCell.m.在该文件中,您必须添加一些IBAction以捕获滑块中的值更改事件.让我们说它是以下内容:
- (IBAction)sliderValueChanged:(UISlider *)sender {
self.myTextLabel.text = [@((int)sender.value) stringValue]; //Do whatever you need to do in cell.
//Now call delegate method which will send value to your view controller:
[delegate didMoveSliderWithValue:sender.value];
}
Run Code Online (Sandbox Code Playgroud)
当你调用delegate方法时,它将运行我们之前在之前编写的实现MyTableViewController.做任何你需要的方法.
这里发生的是你的Cell将消息发送到你想要的VC(Cell的代表),"嘿,调用我们之前在你体内写的委托方法.我立刻给你发送参数".您的VC会获取参数并执行您希望它对该信息执行的任何操作.
用于Swift:
首先,你的TableViewCell.swift文件,创建一个这样的协议:
@class_protocol protocol ContactCellDelegate {
func didMoveSliderWithValue(value: Float)
}
Run Code Online (Sandbox Code Playgroud)
现在在您的Cell类中,创建一个委托属性,如:
var cellDelegate: ContactCellDelegate?
Run Code Online (Sandbox Code Playgroud)
在Slider IBAction中,像这样调用委托方法:
self.cellDelegate?.didMoveSliderWithValue(slider.value)
Run Code Online (Sandbox Code Playgroud)
在您的VC中执行以下更改:
使其符合代表:
class MyTableViewController: UIViewController, ContactCellDelegate
Run Code Online (Sandbox Code Playgroud)
在返回单元格之前添加此行 cellForRowAtIndexPath
cell.cellDelegate = self //Dont forget to make it conform to the delegate method
Run Code Online (Sandbox Code Playgroud)
添加所需委托方法的实现:
func didMoveSliderWithValue(value:float) {
//do what you want
}
Run Code Online (Sandbox Code Playgroud)
我保持Swift部分的精确和总结,因为将详细的Obj-C解释更改为Swift实现应该非常容易.但是,如果您对上述任何指针感到困惑,请发表评论.
另请参阅:StackOverflow使用委托模式回复传递数据
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |