草庐IT

ios - 从自定义 UITableViewCell 获取数据并返回到 UITableViewController

coder 2023-09-06 原文

我有一个由自定义 UITableViewCells 组成的 UITableView。在每个单元格中,都有一个 UILabel 和一个 UISlider。有谁知道如何在其中一个 slider 的值发生变化时,将 slider 的新值从自定义 UITableViewCell(在单独的文件中)发送到 UITableViewController,以便我可以更新从中填充表的数组?

到目前为止我得到的最接近的是失败的 hack:当 slider 值更改时触发 setSelected 事件。虽然这会突出显示已更改的自定义单元格,但 UITableViewController 中的 didSelectRowAtIndexPath 不会拾取该事件。

虽然代码总是受到赞赏,但我正在寻找概念/方法解决方案。

先谢谢你, 杰米

最佳答案

你需要的是Delegate Pattern .

从那里引用来解释它的意思:

Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.


这些图表将帮助您理解发生了什么:

架构:

操作:

至于如何实现,这就是你要做的。


对于 Objective-C:

首先,创建UITableViewCell 的委托(delegate)方法。让我们将其命名为 ContactTableViewCell

在您的 ContactTableViewCell.h 文件中,执行以下操作:

@protocol ContactCellDelegate <NSObject>
@required


-(void) didMoveSliderWithValue:(float) value;

@end



@interface ContactTableViewCell : UITableViewCell


@property (weak, nonatomic) id<ContactCellDelegate> delegate;

现在让您的 TableViewController 符合此委托(delegate)。让我们将您的 VC 命名为 MyTableViewController

MyTableViewController.h 中,执行以下操作:

@interface MyTableViewController : UIViewController <ContactCellDelegate> //Use UITableViewController if you are using that instead of UIViewController.

在您的 cellForRowAtIndexPath 中,在返回单元格之前,添加以下行:

cell.delegate = self;

在您的 MyTableViewController.m 中添加委托(delegate)方法的实现。

-(void) didMoveSliderWithValue: (float) value
{
    NSLog(@"Value is : %f",value);
    //Do whatever you need to do with the value after receiving it in your VC
}

现在让我们回到您的 ContactTableViewCell.m。在该文件中,您必须添加一些 IBAction 来捕获 slider 中的值更改事件。假设它是以下内容:

- (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];

}

当您调用委托(delegate)方法时,它将运行我们之前在 MyTableViewController 中编写的实现。在那个方法中做任何你需要的事情。

这里发生的是你的 Cell 将消息发送到你想要的 VC(它是 Cell 的委托(delegate)),即“嘿,调用我们之前在你体内编写的委托(delegate)方法。我马上向你发送参数” .您的 VC 会获取参数并在当时使用该信息执行您希望它执行的任何操作。


对于 Swift:

首先,在你的 TableViewCell.swift 文件中,创建一个这样的协议(protocol):

@class_protocol protocol ContactCellDelegate {
    func didMoveSliderWithValue(value: Float)
}

现在在您的 Cell 类中,创建一个委托(delegate)属性,例如:

var cellDelegate: ContactCellDelegate?

在您的 Slider IBAction 中,像这样调用委托(delegate)方法:

self.cellDelegate?.didMoveSliderWithValue(slider.value)

在你的 VC 中做这些改变:

使其符合委托(delegate):

class MyTableViewController: UIViewController, ContactCellDelegate

cellForRowAtIndexPath 中返回单元格之前添加此行

cell.cellDelegate = self //Dont forget to make it conform to the delegate method

添加所需委托(delegate)方法的实现:

func didMoveSliderWithValue(value:float) {
            //do what you want
        }

我对 Swift 部分进行了精确和总结,因为将详细的 Obj-C 解释更改为 Swift 实现应该很容易。但是,如果您对上述任何指示感到困惑,请发表评论。

另见:StackOverflow answer on using Delegate pattern to pass data back

关于ios - 从自定义 UITableViewCell 获取数据并返回到 UITableViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264549/

有关ios - 从自定义 UITableViewCell 获取数据并返回到 UITableViewController的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

随机推荐