iOS 7 UITextView选择单词或图像

时间:2013-10-18 15:55:01

标签: ios uitextview nsdatadetector

我在iOS 7中使用了归属文本的UITextView。在放入UITextView之前解析的原始文本看起来像这样。

“欢迎来到我的例子@(John Doe)(johndoeid)@(Jane Doe)(janedoeid)”

当我解析此文本并将其放入UITextView时,它看起来像这样。

“欢迎来到我的例子 John Doe Jane Doe

我的问题是这个。

当我在textview中点击John Doe或Jane Doe时,如何获取用户“johndoe”或“janedoe”的ID,以便我可以采取行动?我正在考虑存放原始位置和新位置并使用它但看起来很笨重。

2 个答案:

答案 0 :(得分:1)

假设您使用的是NSAttributedString,则可以向文本添加自定义属性。请查看下面的链接,查看如何搜索与文本关联的特定属性的示例。

这些示例都不会实际创建自定义属性,但您可以看到我们如何搜索每个字体属性并更改字体大小。附加自定义属性后,您将能够进行类似的操作。如果你遇到困难,请告诉我,我可以尝试一些针对你更具体的东西。

http://ossh.com.au/design-and-technology/software-development/implementing-rich-text-with-images-on-os-x-and-ios/

详细查看OSTextView.m方法的resizeText源列表文件。以下是一些搜索NSFont属性的代码

[self.textStorage enumerateAttributesInRange:rangeAll options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:
 ^(NSDictionary *attributes, NSRange range, BOOL *stop) {

     // Iterate over each attribute and look for a Font Size
     [attributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
         if ([[key description] isEqualToString:@"NSFont"]) {
             UIFont *font = obj;
             float fontSize = font.pointSize + bySize;
             smallestFontSize = MIN(smallestFontSize, fontSize);
             largestFontSize = MAX(largestFontSize, fontSize);
         }

     }];
 }];

该方法的下方是替换NSFont属性的代码,在您的情况下,您可以只添加自定义属性 - 请注意,我们首先复制现有属性,然后添加到它们,因为您可能不想删除任何现有属性属性。

[self.textStorage enumerateAttributesInRange:rangeAll options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:
 ^(NSDictionary *attributes, NSRange range, BOOL *stop) {

     NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];

     // Iterate over each attribute and look for a Font Size
     [mutableAttributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

         if ([[key description] isEqualToString:@"NSFont"]) {

             UIFont *font = obj;
             float fontSize = font.pointSize;
             fontSize += bySize;
             fontSize = MIN(fontSize, MAXFONTSIZE);

             // Get a new font with the same attributes and the new size
             UIFont *newFont = [font fontWithSize:fontSize];

             // Replace the attributes, this overrides whatever is already there
             [mutableAttributes setObject:newFont forKey:key];
         }

     }];

     // Now replace the attributes in ourself (UITextView subclass)
     [self.textStorage setAttributes:mutableAttributes range:range];
 }];

现在,您的自定义属性整齐地嵌入到属性字符串中,您应该能够将其归档并取消归档,而不会丢失它。

答案 1 :(得分:0)

是的,最有意义的是将所有位置存储在NSDictionary中,并在该数据结构中进行查找。

我知道它看起来很笨重,但那真的是你唯一的选择。