- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在修改一个早期项目,在该项目中我使用标签来识别 1-of-5、1-of-16 或 1-of-10 UIButtons
。根据我对 this answer 的理解,我想用自定义属性替换标签.
名为 myInfo
的属性由一个字符串和一个整数组成。这很可能是另一个名称的标签,但它使消息源以一种简单的整数标签所不能的方式唯一可识别,从我的代码中清除魔数(Magic Number),并希望改进文档。
属性是使用类别创建的
UIView+CustomProperties.m
#import "UIView+CustomProperties.h"
@implementation UIView (MyInfo)
-(void)setMyInfo:(id)info
{
objc_setAssociatedObject(self, "_myInfo", info, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(id)myInfo
{
return objc_getAssociatedObject(self, "_myInfo") ;
}
@end
myInfo
在我导入 objc/runtime.h
UIView+自定义属性。
#import <objc/runtime.h>
@interface UIView (MyInfo)
@property ( nonatomic, strong ) id myInfo;
@end
我从创建多组按钮的 UIView 中的方法 (下文) 调用类别。
// define type and number of 5, 16 or 10 buttons
switch (buttonCount) {
case 5:
roundButton.myInfo = [NSString stringWithFormat:@"transpose index %i", i ];
break;
case 16:
roundButton.myInfo = [NSString stringWithFormat:@"player index %i", i ];
break;
case 10:
roundButton.myInfo = [NSString stringWithFormat:@"note index %i", i ];
break;
default:
roundButton.myInfo = @“orphan button“;
break;
}
为了识别消息源,我尝试使用 this method 从 myInfo
中去除所有非数字字符。 .但是,当我尝试删除非数字字符时,我的选择器方法 forButtons
出现了问题
- (void)fromButtons:(UIButton*)button {
NSLog(@"Button %ld tapped", (long int)[button tag]);
NSLog(@"first, %@", button.myInfo);
NSString *newString = [[button.myInfo componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
NSLog(@"then, %@", newString);
NSLog(@"and %li", (long int)newString);
当我构建并运行并按下按钮 1 时,上面的 NSLog
语句产生以下日志
2017-05-25 18:27:33.147 SatGam3[930:607301] Button 1 tapped
2017-05-25 18:27:33.147 SatGam3[930:607301] first, transpose index 1
2017-05-25 18:27:33.148 SatGam3[930:607301] then, 1
2017-05-25 18:27:33.148 SatGam3[930:607301] and 2070247168
请注意,原始标签的 long int
值是正确的,即 1,而从自定义属性中恢复的 long int
是 2070247168。
Q.1 首先,这种做法是否正确?
Q.2 如果是这样,有人可以解释为什么我要从 myInfo
中提取一个 9 位数字值吗?
最佳答案
首先,一个与你的问题无关的问题:你在这里使用 "_myInfo"
作为键有点危险。在实践中你会逃脱它,但它依赖于未 promise 的编译器优化。您打赌编译器(可能还有链接器)将确保同一常量字符串的所有副本都引用二进制文件中的同一内存位置。这恰好是真的,但它不是语言的一部分。 Use a selector instead.
但这不是你的问题。你的问题是这样的:
NSLog(@"and %li", (long int)newString);
newString
是(不出所料)一个 NSString*
。所以这指向该字符串的地址。如果您想将其转换为数字,您需要对其调用 -intValue
。
也就是说,我不会将此数据编码为字符串。将其编码为数据对象:
@interface ButtonInfo
@property (copy) NSString *name;
@property (assign) NSInteger index;
@end
(或者 name
可以是一个枚举,如果它们有固定的集合的话)
如果你想让它更容易阅读,添加一个-description
方法。使用类型系统;它可以帮助你。不要尝试将复杂的类型编码为字符串。
关于ios - 如果这是在 Objective C 中使用自定义字符串属性的正确方法,为什么我不能提取正确的数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178621/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!