1

想知道无论如何我们可以解决在 Mantle 中将带空格的字符串转换为 NSURL 失败的问题吗?

我正在低于 Mantle 错误:

错误域=MTLTransformerErrorHandlingErrorDomain Code=1“无法将字符串转换为 URL”UserInfo=0x7ff9e8de4090 {MTLTransformerErrorHandlingInputValueErrorKey= https://x.com/dev-pub-image-md/x-img/02020-x yy z@2X.png , NSLocalizedDescription=无法将字符串转换为 URL,NSLocalizedFailureReason=输入 URL 字符串https://x.com/dev-pub-image-md/x-img/02020-x yy z@2X.png 格式错误}

在类文件下方;

。H -

#import "Mantle.h"

@interface Place : MTLModel <MTLJSONSerializing>

@property (strong, nonatomic) NSString *placeId;
@property (strong, nonatomic) NSURL *logoURL;

@end

.m -

#import "Place.h"

@implementation Place

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{@"placeId": @"placeId",
             @"logoURL":@"circleImage"
             };
}

+ (NSValueTransformer *)logoURLJSONTransformer {
    return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}

@end

提前致谢!

4

2 回答 2

2

发生这种情况是因为您的字符串不是 URL 结束编码的(URL 不能有空格)。

首先 - 使用以下方法对您的字符串进行 URL 编码。资料来源:堆栈溢出

- (NSString *)urlencodeString:(NSString*)string {
    NSMutableString *output = [NSMutableString string];
    const unsigned char *source = (const unsigned char *)[self UTF8String];
    int sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

然后将其转换为 URL。

在您的特定场景中,您正在使用 Mantle JSON 转换器。所以你可以做的是;

+ (NSValueTransformer *)logoURLJSONTransformer {
    return [MTLValueTransformer transformerUsingReversibleBlock:^id(NSString *str, BOOL *success, NSError *__autoreleasing *error) {
        if (success) {
            NSString *urlEncodedString  = [self urlencodeString:str];
            return [NSURL URLWithString:urlEncodedString];
        }else{
            return @"";
        }

    }];
}
于 2015-08-21T01:28:06.087 回答
0

你可以试试这个

NSString *baseurlString = [NSString stringWithFormat:@"your_url_here"];
NSString *cleanedUrl = [baseurlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

然后将其cleanedUrl用于您的工作。

于 2016-08-01T09:54:51.837 回答