关键词:
【中文标题】选择器和执行选择器【英文标题】:selector and PerformSelector 【发布时间】:2013-12-29 22:48:13 【问题描述】:我有一个UITableView
有几个部分。每个部分都包含一组不同的数据:电话号码、地址......
对于这些集合中的每一个,我都有一个模型:电话号码、地址。它们完全不同,但有一些共同点。
在我的UITableView
中,我有一个包含这些模型/类名的数组:
NSMutableArray *classNames;
在我的UITableView
的viewDidLoad
中,我对所有这些部分进行了一些初始化:
//section 1: PhoneNumbers
phoneNumbers = [PhoneNumbers getAllIDs];
if (phoneNumbers && (phoneNumbers.count >0))
[classNames addObject:@"PhoneNumber"];
[dataIDs addObject:phoneNumbers];
我对所有其他部分/模型再次执行此操作:
//section 2: Addresses
addresses = [Address getAllIDs];
if (addresses && (addresses.count >0))
[classNames addObject:@"Address"];
[dataIDs addObject:addresses];
// section 3: .....
到目前为止还可以初始化。这看起来不错,工作正常。
稍后在我的cellForRowAtIndexPath
中,我将通过这些 ID 检索实际数据
NSInteger section = [indexPath section];
NSInteger row = [indexPath row];
NSArray *rows = [dataIDs objectAtIndex:section];
NSNumber *recordID = [rows objectAtIndex:row];
然后我会弄清楚我们必须在哪个类中获取实际数据:
Class displayedDataClass = NSClassFromString ([classNames objectAtIndex:section]);
并获取数据以填充单元格。
id displayedRecord = [[displayedDataClass alloc] init];
[displayedRecord getByID:recordID];
然后我可以使用以下方法在单元格中设置标签:
[cell.someLabel setText:[displayRecord fullDesciption]];
到目前为止一切顺利,我成功地抽象了所有内容,cellForRowAtIndexPath
不需要知道事物的来源,只要这些类响应用于检索标签数据的方法(在上面的情况下为 fullDescription )
现在我需要在每个 Cell 中都有一个 actionButton 来执行某种动作 为了确保我理解选择器和 performSelection 的概念,我只是在我的 TableView 类中快速而肮脏地进行了操作:
- (void) buttonTarget
NSLog (@"yes");
在我的cellForRowAtIndexPath
方法中创建了一个带有以下目标的按钮:
button addTarget:self action:@selector(buttonTarget) forControlEvents:UIControlEventTouchUpInside];
好的,到目前为止一切顺利,一切正常。但这不是我真正想要的。该操作不应在此处执行,而应在实际类中执行 (PhoneNumber,Address,...)。
为了保持整洁,我制作了一个模型 Action,其中包含按钮的图标、描述和选择器:
@interface Action : NSObject
@property (nonatomic, strong) NSString *description;
@property (nonatomic, strong) UIImage *icon;
@property (nonatomic ) SEL selector;
@end
在我的 PhoneNumber 类(和类似的类)中,操作设置为正确的选择器:
Action *phoneAction = [[Action alloc] init];
phoneAction.description = NSLocalizedString(@"Call", @"Call button description");
phoneAction.icon = [UIImage imageNamed:@"phone"];
phoneAction.selector = @selector(callPhone);
当然 callPhone 是在 PhoneNumber 类中实现的。
然后在我的 TableView 中获取该单元格的操作
action = [displayedRecord action];
然后我尝试在我的 Button 中使用该选择器:
[button addTarget:displayedRecord action:[action selector] forControlEvents:UIControlEventTouchUpInside];
但是这里出了点问题:我们从来没有到达那个方法,我得到了以下错误:
[UIDeviceWhiteColor callPhone]:无法识别的选择器发送到实例 0x874af90 2013-12-29 23:23:03.629 Thinx[27242:907] * 终止应用程序 由于未捕获的异常“NSInvalidArgumentException”,原因: '-[UIDeviceWhiteColor callPhone]: 无法识别的选择器发送到 实例 0x874af90'
【问题讨论】:
【参考方案1】:听起来你有一个僵尸。当您收到一个无意义的操作被发送到一个对象时,这通常意味着您的对象在您可以向它发送消息之前被释放。
在您的情况下,您将添加“displayedRecord”作为按钮的目标。
为了使其工作,您需要在按钮对象的生命周期内保持对 displayRecord 调用的强引用。什么拥有您显示的Record 对象?
如果您无法通过查看代码来调试此问题,您可以使用僵尸工具来尝试解决。
【讨论】:
这可能是一个正确方向的答案! “displayedRecord”在 cellForRowAtIndexPath 中定义(如我的问题中所写)。但由于它是一个局部变量,它可能不够“强大”。我该如何做到这一点? 是否只有一个显示的Record 对象,还是为每个单元格创建一个?如果只有一个,请将其作为视图控制器的属性。如果每个单元格有一个不同的子类,请创建一个 UITableViewCell 的自定义子类,并使用一个属性(类型为 id)来保存该单元格的显示数据类对象。 非常感谢邓肯。这真的是解决方案。我知道有一个很好的实现,其中功能被抽象并放在它所属的地方!我已经为我的 UITableViewCell 提供了一个自定义类,因此添加该属性很容易(起初它不起作用,但我忘记让我的自定义 UITableViewCell 中的实例变量变得强大!)【参考方案2】:在您无法识别的选择器错误中,您将消息发送到名为 UIDeviceWhiteColor 的对象。该类是否有一个名为 callPhone 的方法?在我看来,displayedRecord 并未指向您认为的对象。
【讨论】:
我的代码中没有 UIDeviceWhiteColor 类。我的 PhoneNumber 类确实有一个 callPhone 类。 堆栈跟踪告诉您正在调用的对象 UIDeviceWhiteColor - Apple SDK 私有类正在接收您的消息。意思是,您的变量 displayRecord 出于某种原因指向该变量。我猜你在某个地方不小心分配了它。设置一些断点并检查其类类型 正如另一位绅士指出的那样,您可能会有僵尸。进入调试设置和启用僵尸可能会有所帮助。h514-后代选择器和子元素选择器
14-后代选择器和子元素选择器<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>14-后代选择器和子元素选择器</title></head><body><!--1.后代选择器和子元素选择器之间的区别?1.1后代选择器使用空 查看详情
使用 jQuery 组合类选择器和属性选择器
】使用jQuery组合类选择器和属性选择器【英文标题】:CombiningaclassselectorandanattributeselectorwithjQuery【发布时间】:2011-09-0822:54:51【问题描述】:是否可以将类选择器和属性选择器与jQuery结合起来?例如,给定以下HTML:<TABLE><... 查看详情
css后代选择器,子选择器和相邻兄弟选择器
平时在代码练习中,经常用到后代选择器,子选择器也会用到,这里做个总结:1,后代选择器和子选择器区别:①写法不一样:后代选择器的标识为:空格如:ulli{width:150px;}【ul和li之间用空格隔开】子选择器的标识为:>如:... 查看详情
css选择器和权重计算
CSS选择器类选择器ID选择器标签名选择器子选择器(ul>li)通配符选择器(*)属性选择器(a[name="input"])伪类选择器(li:nth-child)一个标签的样式渲染顺序:id>class/伪类>标签选择器的权重计算:假设:id选择器的权重为100class/伪类的权重... 查看详情
基础css基础选择器和属性
目录选择器#idID选择器.class类选择器#id,.class群组选择器#id.class后代选择器#id>.class子选择器#id+.class毗邻选择器.class[type="text"]属性选择器新增选择器权重值a:link伪类清浮动常用给布局水平居中垂直居中文本超出隐藏盒模型标准盒模... 查看详情
id选择器和类选择器
类选择器:类命名规则:样式点定义,结构类(class)调用,一个或多个,开发最常用。各个类名中间用空格隔开。id选择器:样式#,结构是id,只能调用一次,别人切勿使用。这张图片的写法是错误的:id选择器只能调用一次。... 查看详情
css3选择器归类整理---基本选择器和属性选择器
css3选择器分类CSS3选择器分类如下图所示 选择器的语法1.基本选择器类型代码功能描述通配选择器*{margin:0;padding:0;border:none;}选择文档中所有HTML元素元素选择器body{background:#eee;}选择指定类型的HTML元素类选择器.list{list-style:squar... 查看详情
jquery选择器——子元素筛选选择器和表单元素选择器
子元素筛选选择器和表单元素选择器1 子元素筛选选择器描述$(":first-child") 选择所有父级元素下的第一个子元素$(":last-child") 选择所有父级元素下的最后一个子元素$(":only-child")&... 查看详情
css选择器——属性选择器和基于元素结构关系的选择器
在有些标记语言中,不能使用类名和id选择器,于是css2引入了属性选择器。3.属性选择器 a)根据是否存在该属性来选择 如果希望选择有某个属性的元素,例如要选择有class属性的所有h1元素,使其文本为银色,可以这... 查看详情
练习题:选择器和选择好友
一、年月日选择器12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576<select id="nian"onclick="biantian()"> 查看详情
包含类、子选择器和相邻兄弟选择器的 CSS 选择器的等效 XPath 是啥?
】包含类、子选择器和相邻兄弟选择器的CSS选择器的等效XPath是啥?【英文标题】:What’stheequivalentXPathforaCSSselectorcontainingaclass,childandadjacentsiblingselector?包含类、子选择器和相邻兄弟选择器的CSS选择器的等效XPath是什么?【发布... 查看详情
子选择器后代选择器和通用选择器以及伪选择器
子选择器(>).food>li{border:1pxsolidred;}后代选择器(空格)包含选择器,即加入空格,用于选择指定标签元素下的后辈元素。如右侧代码编辑器中的代码:.firstspan{color:red;}这行代码会使第一段文字内容中的“胆小如鼠”字体颜色... 查看详情
选择变量/选择器和 $(this)
】选择变量/选择器和$(this)【英文标题】:selectingvariable/selectorand$(this)【发布时间】:2011-06-1700:28:46【问题描述】:我目前正在尝试优化我拥有的功能,并希望同时选择$(this)以及$(#selector)或varName我在下面列出了我的代码以显示... 查看详情
csscss样式的三种选择器:基本选择器组合选择器和属性选择器
基本选择器基本选择器分为四种:通用选择器标签选择器类选择器ID选择器1.通用选择器通用选择器是一个星号*,功能类似于通配符,用与匹配文档中所有的元素类型,使页面中所有元素都是用该规则。<!DOCTYPEhtml>&l... 查看详情
csscss样式的三种选择器:基本选择器组合选择器和属性选择器
基本选择器基本选择器分为四种:通用选择器标签选择器类选择器ID选择器1.通用选择器通用选择器是一个星号*,功能类似于通配符,用与匹配文档中所有的元素类型,使页面中所有元素都是用该规则。<!DOCTYPEhtml>&l... 查看详情
日期选择器和时间选择器的问题
】日期选择器和时间选择器的问题【英文标题】:Problemwithdatepickerandtimepicker【发布时间】:2011-08-2004:23:05【问题描述】:您好,我将android开发人员中的示例代码放在同一个类中,但我有一个问题@覆盖受保护的对话框onCreateDialog(... 查看详情
Firefox,查询选择器和可见的伪选择器
】Firefox,查询选择器和可见的伪选择器【英文标题】:Firefox,queryselectorandthevisiblepseudoselector【发布时间】:2012-11-0312:39:09【问题描述】:是否可以使用带有Firefox的querySelector()或querySelectorAll()函数的伪选择器来检测可见性?特别... 查看详情
css后代选择器和子选择器的区别
...乃至千秋万代而子那肯定就只是指儿子咯 参考技术B后代选择器包含了之后的所有层级,子选择器只包含一个层级 参考技术C回答您好,您的问题我已经看到了,正在整理答案,请稍等一会儿哦~类选择器和后代选择器的区别1.子... 查看详情