2015-12-08 3 views
0

Я буквально пробовал все. Я уверен, что моя ошибка будет чем-то таким глупым и маленьким, как пропущенный self .string, но я не могу заставить его работать. Моя мини-программа выполняет проверку, если файл с именем Code.txt уже существует. Если он делает, то он будет загружать файл в UITextView (и он делает это просто отлично). Если он не существует, он создаст имя файла Code.txt. Все это прекрасно.string = textView.text, но строка is (nul)

Однако, когда я пытаюсь сохранить текущий текст внутри UITextView в файл, я не могу сначала сохранить его в строке. Это то, что я пытаюсь достичь:

При выходе из приложения: textView.text --> codeString --> Code.txt [saved]

Кроме этого, опять же, я не могу сохранить textView.text в строку (codeString). NSLog возвращает его как гайку (см. NSLog(@"String: %@", self.codeString); в методе saveFile).

ViewController.h

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "BuildViewController.h" 

@interface ViewController : UIViewController <UITextViewDelegate> 

@property (nonatomic, strong) NSString *codeString; 
@property (nonatomic, retain) IBOutlet UITextView *textView; 
@property (nonatomic, retain) BuildViewController *buildViewController; 

- (void)saveFile; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize textView; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    textView.delegate = self; 

    // Check if Code.txt exists 
    NSString* documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *codeFile = [NSString stringWithFormat:@"%@/Code.txt", documentsDir]; 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:codeFile]; 

    NSLog(@"viewWillAppear"); 

    if (fileExists == true) { 
     // Code.txt does exist, continue to viewDidLoad 
     NSLog(@"Code.txt does exist"); 
    } 

    else if (fileExists == false) { 
     // Code.txt does not exist, create the file 
     NSLog(@"Code.txt does not exist"); 
     ViewController *viewController = [ViewController alloc]; 
     [viewController createFile]; 
    } 

    self.textView.delegate = self; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // Load Code.txt 
    NSString* documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString* codeFile = [documentsDir stringByAppendingPathComponent:@"Code.txt"]; 
    NSString *codeString = [NSString stringWithContentsOfFile:codeFile encoding:NSUTF8StringEncoding error:NULL]; 
    textView.text = codeString; 
    NSLog(@"Loaded Code.txt"); 
} 

- (void)saveFile { 
    // Save text to Code.txt 
    self.codeString = textView.text; 
    NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *codeFile = [NSString stringWithFormat:@"%@/Code.txt", documentsDir]; 
    [self.codeString writeToFile:codeFile 
       atomically:NO 
        encoding:NSStringEncodingConversionAllowLossy 
         error:nil]; 
    NSLog(@"String: %@", self.codeString); 
    NSLog(@"Saved text to Code.txt"); 
} 

- (void)createFile { 
    NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *codeFile = [NSString stringWithFormat:@"%@/Code.txt", documentsDir]; 
    NSString *codeString = @"print(\"Hello, world\")"; 
    [codeString writeToFile:codeFile 
       atomically:NO 
       encoding:NSStringEncodingConversionAllowLossy 
        error:nil]; 
    NSLog(@"Created Code.txt"); 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
+0

Где называется saveFile? –

+0

@ JörnBuitink Извиняюсь, saveFile вызывается из приложения AppDelegateDidEnterBackground и applicationWillTerminate: 'ViewController * viewController = [ViewController alloc]; [viewController saveFile]; ' –

+0

Вы действительно создаете новый экземпляр контроллера вида в' applicationDidEnterBackground'? – Avi

ответ

0

Ваша ошибка создается новый экземпляр ViewController как сказал @Avi.

Вы должны получить существующий экземпляр в памяти

Если вы хотите сохранить файл, когда в фоновом режиме, вы можете зарегистрировать уведомление

В viewDidLoad, добавьте эту строку

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

Затем добавьте этот до ViewController

-(void)enterBackground:(NSNotification *)notification{ 
    [self saveFile]; 
} 

Затем в dealloc

-(void)dealloc{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; 
} 
+0

Теперь мое приложение аварийно завершает работу: '[UINavigationController saveFile]: нераспознанный селектор отправлен в экземпляр 0x15c815600 2015-12-08 03: 03: 21.879 Приложение [3485: 917222] *** Завершение приложения из-за неотображенного исключения« NSInvalidArgumentException », причина: '- [UINavigationController saveFile]: непризнанный селектор отправлен в экземпляр 0x15c815600'' –

+0

Попробуйте способ обновления, вы можете зарегистрировать уведомление при вводе фона. – Leo

Смежные вопросы