Почему NSLog правильно форматирует текст, а NSMutableArray - нет? - PullRequest
1 голос
/ 30 января 2012

РЕДАКТИРОВАТЬ: название изменено, чтобы лучше отражать мою проблему.

У меня проблемы с анализом большого объема текста, который включает разрывы строк и кавычки из данных XML. Я запускаю парсер через AppDelegate, чтобы он предварительно загружался при открытии приложения. Моя проблема в том, что текст корректно вставляется в раздел анализатора didEndElement, но когда мое представление вызывает текст из NSMutableArray из AppDelegate, \ n и другие html-теги появляются, когда они не должны. Скриншоты размещены внизу этого вопроса.

AppDelegate.h соответствующий код:

@interface AppDelegate : UIResponder <UIApplicationDelegate, NSXMLParserDelegate>
{
    NSXMLParser             *exhibitParser;
    NSMutableArray          *exhibitInfo;
}

@property (nonatomic, retain) NSXMLParser    *exhibitParser;
@property (nonatomic, retain) NSMutableArray *exhibitInfo;

- (void) parseAllData;

@end

AppDelegate.m:

#import "AppDelegate.h"
#import "ExhibitParser.h"


@implementation AppDelegate

@synthesize exhibitParser, exhibitInfo;
@synthesize window = _window;

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    //delay to allow for splash screen    
    [self performSelector:@selector(parseAllData) withObject:nil afterDelay:2.0f];  

    return YES;
}

- (void)parseAllData
{    
     exhibitParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.website-Goes-Here.com/variable=%@", [[NSUserDefaults standardUserDefaults]objectForKey:@"gallery_preference"]]]];

     ExhibitParser *exParser = [[ExhibitParser alloc] initExhibitParser];

     [exhibitParser setDelegate:exParser];
     //[parser parse];

     BOOL exsuccess = [exhibitParser parse];

     if(exsuccess)
     NSLog(@"No Exhibit Errors");
     else
     NSLog(@"Exhibit ERROR!!"); 

}

ExhibitParser.h:

#import <Foundation/Foundation.h>

@class AppDelegate, ExhibitInfo;

@interface ExhibitParser : NSObject
{
    NSString            *currentExhibit;

    NSMutableString *descAttribute;
    NSMutableDictionary *dict;

    AppDelegate     *exAppDelegate;
    ExhibitInfo     *aExItems;
}

@property (nonatomic, retain) NSString            *currentExhibit;
@property (nonatomic, retain) NSMutableString     *descAttribute;
@property (nonatomic, retain) NSMutableDictionary *dict;

@property (nonatomic, retain) ExhibitInfo          *aExItems;

- (ExhibitParser *) initExhibitParser;

@end

ExhibitParser.m:

(Примечание. Последовательность форматирования в didEndElement берет текст XML и делает его лучше для нас на iPad. \ N, который здесь пишется, отображается ПРАВИЛЬНО как разрыв строки в следующем NSLog, но отображается как буквально "\ n" один раз отображается в ExhibitView.)

#import "ExhibitParser.h"
#import "AppDelegate.h"
#import "ExhibitInfo.h"

@implementation ExhibitParser
@synthesize currentExhibit, descAttribute, dict, aExItems;

- (ExhibitParser *) initExhibitParser
{
    self = [super init];

    exAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    currentExhibit = [elementName copy];

    if ([elementName isEqualToString:@"ExhibitData"])
    {
        exAppDelegate.exhibitInfo = [[NSMutableArray alloc] init];
    }

    if ([elementName isEqualToString:@"exhibit"])
    {
        aExItems = [[ExhibitInfo alloc] init];

        dict = [[NSMutableDictionary alloc] init];
        descAttribute = [[NSMutableString alloc] init];
    }

    if ([attributeDict objectForKey:@"exhibitfact"]) 
    {
        descAttribute = [attributeDict objectForKey:@"exhibitfact"];
        [dict setObject:descAttribute forKey:@"exhibitfact"];
    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

    if([elementName isEqualToString:@"exhibit"])
    {
        [exAppDelegate.exhibitInfo addObject:aExItems];
        [dict setObject:descAttribute forKey:@"exhibitfact"];

        //Formatting Series to make it pretty
        NSString *descriptionRaw = [NSString stringWithFormat:@"%@", descAttribute];
        NSString *descriptionFinal = [descriptionRaw stringByReplacingOccurrencesOfString:@"    " withString:@"\n"];
        NSString *descriptionEdited = [descriptionFinal stringByReplacingOccurrencesOfString:@"  " withString:@" "];

        //This Log displays the text perfectly
        NSLog (@"%@", descriptionEdited);
        [aExItems setDescription:descriptionEdited];
    }


}

//I have read that foundCharacters can cause issues with hidden characters such as \n, so I've tried leaving this in and commenting it out. It seems to have no effect either way.

//- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
//{
//    
//    if([self.currentExhibit isEqualToString:@"description"])
//    {
//        [self.descAttribute appendString:string];
//    }
//}

@end

ExhibitInfo.h:

#import <Foundation/Foundation.h>

@interface ExhibitInfo : NSObject
{
    NSString *description;
}

@property (nonatomic, retain) NSString *description;

@end

ExhibitInfo.m:

#import "ExhibitInfo.h"

@implementation ExhibitInfo
@synthesize description;

@end

ExhibitView.m (где текстовое поле будет заполнено проанализированными данными):

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setTitle:@"Exhibit Information"];

    exAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    exhibitText.text = [NSString stringWithFormat:@"%@", [exAppDelegate.exhibitInfo description]];

}

Так что мне совершенно не по себе: NSLog в ExhibitParser.m корректно отображает весь текст, но в ExhibitView.m, когда в полеinfititText.text добавляется то, что, по моему мнению, должно быть идентично тому, что в NSLog, это не так. Он показывает \ n и открытия и закрытия () вокруг всего тела. Это потому, что он записывается в NSMutableArray перед вызовом в ExhibitView? Почему есть разница между NSLog и тем, что показывает вид?

Снимок экрана с выводом NSLog - отображается правильно: NSLog (@

Снимок экрана, показывающий, как он отображается в представлении при запуске приложения (обратите внимание на круглые скобки в начале и в конце, \ n как из моего форматирования, так и из разрывов строк, кавычки в начале и в конце и \ рядом с кавычками в середине текста): exhibitText.text = [NSString stringWithFormat:@

1 Ответ

1 голос
/ 30 января 2012

Когда вы найдете свой элемент, попробуйте удалить символ новой строки следующим образом:

if ([attributeDict objectForKey:@"exhibitfact"]) 
        {
            descAttribute = [[attributeDict objectForKey:@"exhibitfact"] stringByReplacingOccurrencesOfString:@"/n" withString:@""];         

            [dict setObject:descAttribute forKey:@"exhibitfact"];
        }
...