Поставлен в тупик: список свойств работает в симуляторе и других приложениях, но не при тестировании на iphone 4 - PullRequest
0 голосов
/ 01 июля 2011

Я работаю над приложением, которое записывает данные в .plist из представления, а затем извлекает его, чтобы заполнить некоторые UILabels в другом представлении.Я делал это несколько раз в прошлом, и он отлично работал как на устройстве, так и на симуляторе.На этот раз он отлично работает на симуляторе, но не на устройстве.Я просмотрел все соединения и код, но просто не могу понять, почему он не работает.Я подозреваю, что по какой-то причине данные не находятся в конце пути к файлу, но если это не так, я не могу понять, почему это так.

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

Кто-нибудь может подсказать, почему у меня возникла эта проблема и как ее исправить?Именно поэтому он работает на симуляторе, а не на телефоне, что меня смущает, особенно когда в прошлом я использовал один и тот же код для создания полнофункциональных приложений.Я использую xCode 4 и тестирую на iphone 4:

Код выглядит следующим образом.Сначала я проверяю, есть ли данные в конце пути к файлу данных, например:

- (NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirctory = [paths objectAtIndex:0];
    return [documentsDirctory stringByAppendingPathComponent:memberDetails];
}

Затем в viewWillAppear я получаю данные и использую их для заполнения UIlabels в представлении.Немногие из меток являются видимыми или невидимыми на основании данных, которые они содержат.ViewWillAppear выглядит следующим образом:

-(void)viewWillAppear:(BOOL)animated

{

// Check data file path and if it exists, load data from there. 
    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])

    {
        ///All of the following handles the reloading of data from the plist.
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
        memName.text = [array objectAtIndex:0];
        memAddress.text = [array objectAtIndex:1];
        memOccupation.text = [array objectAtIndex:2];
        sherex.text = [array objectAtIndex:3];


        if ([[array objectAtIndex:3] isEqualToString:@"winstonwinston"]) {
            cvName.hidden = NO;
            memName.hidden = NO;
            cvAddress.hidden = NO;
            memAddress.hidden = NO;
            cvOccupation.hidden = NO;
            memOccupation.hidden = NO;
            sherex.hidden = YES;
            altText.hidden = YES;


        } 
        else {
            cvName.hidden = YES;
            memName.hidden = YES;
            cvAddress.hidden = YES;
            memAddress.hidden = YES;
            cvOccupation.hidden = YES;
            memOccupation.hidden = YES;
            sherex.hidden = YES;
            altText.hidden = NO;
        }



        [array release];

    }
    [super viewWillAppear:animated];  
    }

Возможно, стоит отметить одну вещь: оператор if / else, похоже, не работает и на устройстве.Другими словами, все в представлении видно.Мне кажется, это может указывать на то, что проблема может заключаться не в данных, так как если бы можно было определить, существует или нет элемент с именем «winstonwintson» или нет, и соответственно отобразить скрытые / отображающие элементы представления.

Если у кого-то есть понимание, пожалуйста, помогите!Я полностью застрял.Спасибо, что нашли время, чтобы прочитать это.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Если это касается файлов и работает на симуляторе, но не на устройстве, это обычно одна из двух проблем.

  1. вы используете имена файлов, которые хорошо работают в нечувствительной к регистру файловой системе (симулятор), но не на устройстве (чувствительная к регистру файловая система).
    Единственный способ представить, как это повлияет на вас, - это попытаться скопировать исходный набор данных в каталог документов.Например, если вы пытаетесь скопировать из вашего пакета, проверьте путь, который возвращается [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"bar"]; Если путь равен нулю, вам нужно снова проверить имена файлов, они должны быть точно одинаковыми.

  2. вы пишете в каталоги, которые не доступны для записи на устройстве.
    Одна очень маловероятная возможность состоит в том, что memberDetails содержит что-то вроде /../foo, и вы пытаетесь писать в не доступный для записи каталог,На симуляторе вы можете записать свои файлы куда угодно, на устройстве такой доступ не удастся.

Итак, вы должны попытаться ответить на два вопроса:

  • как сохранить данные в каталоге документов?
  • чтотакое содержание memberDetails?(как выглядит возвращенный путь от dataFilePath?)

РЕДАКТИРОВАТЬ:

NSLog всегда очень помогает при отладке таких проблем, просто распечатайте ваши пути ипроверьте, все ли в порядке.

Примерно так:

NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"bar"];
NSLog(@"Source: %@", sourcePath);
if (![[NSFileManager...

или вы можете использовать if условие

if (sourcePath == nil) {
    NSLog(@"Something is wrong with the sourcePath, because sourcePath == nil!");
}

EDIT2:

Поскольку ни один из этих видовКонфигурационные детали называются, скорее всего, if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) никогда не соответствует действительности.Это означает, что файл не существует.

1 голос
/ 01 июля 2011

Удалить приложение с телефона, очистить проект, пересобрать и запустить. Иногда полезно отключить фоновый режим, для этого добавьте:

<key>UIApplicationExitsOnSuspend</key><true/>

к списку приложений.

...