2

我想確認以下功能的支持:IOS 7應用程序崩潰時NSAttributedString +的NSString發送到UIActivityViewController和郵件應用程序選擇

我有一個簡單的應用程序,其中我想一個字符串數組發送到UIActivityViewController 。該數組包含一個屬性字符串,也是一個常規字符串。當我點擊分享按鈕並打開郵件應用程序時,出現崩潰和錯誤。然而,當我只發送屬性字符串本身,它的作品。

我在IOS6上試過這個,它在那上面工作得很好。

下面是配置:

NSAttributedString *appName=[[NSAttributedString alloc] initWithString:@"TasteBank\n"  
     attributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:[UIFont 
     systemFontSize]],NSForegroundColorAttributeName:[UIColor brownColor]}]; 

//crash seen when @"test" added to array without that no crash when mail app opened on ios7 

NSMutableArray *dataToShare = [[NSMutableArray alloc ] initWithObjects: appName, @"test", nil]; 

UIActivityViewController* activityViewController = 
     [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil]; 

[self presentViewController:activityViewController animated:YES completion:^{}]; 

是有什麼問題呢? IOS7支持這種配置嗎?如果是這樣,這可能是一個錯誤?

我看到下面的錯誤,當我與IOS 7上我的iPhone 4上運行:

2013-10-17 11:43:50.609 testing12[2499:60b] -[NSConcreteMutableAttributedString appendString:]:  unrecognized selector sent to instance 0x165ae670 
2013-10-17 11:43:50.612 testing12[2499:60b] Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMutableAttributedString appendString:]: unrecognized selector sent to instance 0x165ae670' 
First throw call stack: 
(0x2ff53f53 0x3a32c6af 0x2ff578e7 0x2ff561d3 0x2fea5598 0x32c389a1 0x328e2f2b 0x328e2bb1 0x328e2791 0x328e23b7 0x328e20dd 0x3284c101 0x3284c101 0x326f9601 0x326f468d 0x326c9a25 0x326c8221 0x2ff1f18b 0x2ff1e65b 0x2ff1ce4f 0x2fe87ce7 0x2fe87acb 0x34ba8283 0x32729a41 0xbd1ed 0x3a834ab7) 

我看到這個錯誤時,在Xcode 5 IOS7.0模擬器上運行:

2013-10-17 11:23:42.054 testing12[3258:a0b] -[NSConcreteMutableAttributedString appendString:]: unrecognized selector sent to instance 0xa181470 
2013-10-17 11:23:42.085 testing12[3258:a0b] Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMutableAttributedString appendString:]: unrecognized selector sent to instance 0xa181470' 
First throw call stack: 
(0 CoreFoundation      0x017345e4 exceptionPreprocess + 180 
1 libobjc.A.dylib      0x014b78b6 objc_exception_throw + 44 
2 CoreFoundation      0x017d1903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
3 CoreFoundation      0x0172490b forwarding___ + 1019 
4 CoreFoundation      0x017244ee _CF_forwarding_prep_0 + 14 
5 UIKit        0x008bdfa3 -[UIMailActivity prepareWithActivityItems:] + 2346 
6 UIKit        0x008b9242 -[UIActivityViewController _executeActivity] + 424 
7 UIKit        0x008ba824 -[UIActivityViewController _performActivity:] + 1359 
8 libobjc.A.dylib      0x014c981f -[NSObject performSelector:withObject:] + 70 
9 UIKit        0x0063c75a -[UIActivityGroupViewController collectionView:didSelectItemAtIndexPath:] + 148 
10 UIKit        0x0083929b -[UICollectionView _selectItemAtIndexPath:animated:scrollPosition:notifyDelegate:] + 605 
11 UIKit        0x008516d8 -[UICollectionView _userSelectItemAtIndexPath:] + 189 
12 UIKit        0x00851895 -[UICollectionView touchesEnded:withEvent:] + 437 
13 libobjc.A.dylib      0x014c9874 -[NSObject performSelector:withObject:withObject:] + 77 
14 UIKit        0x00382f92 forwardTouchMethod + 271 
15 UIKit        0x00383002 -[UIResponder touchesEnded:withEvent:] + 30 
16 libobjc.A.dylib      0x014c9874 -[NSObject performSelector:withObject:withObject:] + 77 
17 UIKit        0x00382f92 forwardTouchMethod + 271 
18 UIKit        0x00383002 -[UIResponder touchesEnded:withEvent:] + 30 
19 UIKit        0x0059dd7f _UIGestureRecognizerUpdate + 7166 
20 UIKit        0x00268d4a -[UIWindow _sendGesturesForEvent:] + 1291 
21 UIKit        0x00269c6a -[UIWindow sendEvent:] + 1030 
22 UIKit        0x0023da36 -[UIApplication sendEvent:] + 242 
23 UIKit        0x00227d9f _UIApplicationHandleEventQueue + 11421 
24 CoreFoundation      0x016bd8af CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
25 CoreFoundation      0x016bd23b __CFRunLoopDoSources0 + 235 
26 CoreFoundation      0x016da30e __CFRunLoopRun + 910 
27 CoreFoundation      0x016d9b33 CFRunLoopRunSpecific + 467 
28 CoreFoundation      0x016d994b CFRunLoopRunInMode + 123 
29 GraphicsServices     0x036859d7 GSEventRunModal + 192 
30 GraphicsServices     0x036857fe GSEventRun + 104 
31 UIKit        0x0022a94b UIApplicationMain + 1225 
32 testing12       0x00002efd main + 141 
33 libdyld.dylib      0x01d70725 start + 0 
34 ???         0x00000001 0x0 + 1 
) 
+0

我得到了同樣的崩潰,但只有當我包含'NSAttributedString'和'NSURL'。傳遞'NSAttributedString'和'UIImage'可以正常工作。 – deanWombourne

+0

這個問題仍然發生在iOS 8上。 –

回答

4

我不知道這是否會有所幫助,但我解決了一個自定義活動提供程序的問題,該提供程序只給了一個NSString電子郵件類型,並將該字符串賦予所有其他字符串。電子郵件控制器自動檢測到字符串是HTML並正確格式化它。

我想如果你可以從HTML獲得相同的效果,你可以使用你的屬性字符串,這可能有幫助嗎?

@implementation ProductActivityItemProvider 

... 

- (id)placeholderItem { 
    return [[NSAttributedString alloc] initWithString:@""]; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType { 

    if ([activityType isEqualToString:UIActivityTypeMail]) 
     return [NSString stringWithFormat:@"I shared %@", self.product.title]; 

    return nil; 
} 

- (id)item { 
    NSString *raw = [NSString stringWithFormat:@"<html><body>%@<br />%@<br /><b>%@</b></body></html>", 
        self.product.designer, 
        self.product.title, 
        self.product.price]; 

    // The mail controller will (a) autodetect HTML and (b) crash if it's given an attributed string. sigh. 
    if ([self.activityType isEqualToString:UIActivityTypeMail]) 
     return raw; 

    NSData *data = [raw dataUsingEncoding:NSUTF8StringEncoding]; 
    NSDictionary *options = @{                     
     NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,            
     NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding) 
    }; 

    NSAttributedString *text = [[NSAttributedString alloc] initWithData:data 
                   options:options 
                documentAttributes:nil 
                    error:nil]; 
    return text; 
} 

@end 
0

在這裏有一些快速的解決方案。只是實現一個類別:

@implementation NSMutableAttributedString (append) 
-(void)appendString:(id)string{ 
    if([string isKindOfClass:[NSString class]]){ 
     [self appendAttributedString:[[NSAttributedString alloc] initWithString:string]]; 

    }else if ([string isKindOfClass:[NSAttributedString class]]){ 
     [self appendAttributedString:string]; 
    } 
} 
@end 
相關問題