XCode противоречивые результаты на нескольких компьютерах - PullRequest
0 голосов
/ 17 октября 2011

Итак, член проектной группы и я работали над нашими частями отдельно. Я работал над половиной представлений в приложении, а он работал над другой. Я послал ему свою половину, чтобы объединить с его половиной, но когда он попытался открыть мою половину и запустить ее, мы получили противоречивые результаты. Мы еще не объединили их, поэтому они не должны вести себя иначе. Я пытался протестировать его на нескольких других компьютерах, и все они дали одинаковый результат (отличный от моего).

Следующий код должен напечатать «CHECKED X». X представляет количество клеток, которые отмечены в этой точке. На моем компьютере выводится «ПРОВЕРЕНО 1..2..3..4», и вы можете выбрать только до 4, в зависимости от того, сколько отмечено. На любом другом компьютере он печатает «ПРОВЕРЕНО 0», и вы можете отметить столько, сколько хотите (но вы не можете снять галочку с них). Код для их отметки здесь:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        if ((cell.accessoryType == UITableViewCellAccessoryNone) && [[DataContainerSingleton theDataContainerSingleton].favourites count] < 4 && ![self.tickedIndexPaths containsObject:indexPath])
        {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                [self.tickedIndexPaths addObject:indexPath];

                [[DataContainerSingleton theDataContainerSingleton].favourites addObject:[drinks objectAtIndex:indexPath.row]]; // DOES NOT ADD AN OBJECT?
                NSLog(@"CHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
        }
        else if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
        {
            [self.tickedIndexPaths removeObject:indexPath];
            for (int i = 0; i < [[DataContainerSingleton theDataContainerSingleton].favourites count]; i++)
            {
                NSString *drinkName = [[drinks objectAtIndex:indexPath.row] name];
                NSString *favName = [[[DataContainerSingleton theDataContainerSingleton].favourites objectAtIndex:i] name];

                if ([drinkName isEqualToString: favName])
                {
                    cell.accessoryType = UITableViewCellAccessoryNone;
                    [[DataContainerSingleton theDataContainerSingleton].favourites removeObjectAtIndex:i];
                    NSLog(@"UNCHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
                }
            }

        }

}

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

Вот код для класса DataContainerSingleton:

DataContainerSingleton.h

#import <Foundation/Foundation.h>


@interface DataContainerSingleton : NSObject 
{
    NSMutableArray *favourites;
    NSMutableArray *drinks;
    NSString *name;
    int caffeine;

    @private

}

@property (nonatomic, retain) NSMutableArray *favourites;
@property (nonatomic, retain) NSMutableArray *drinks;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) int caffeine;

+ (DataContainerSingleton *) theDataContainerSingleton;
@end

DataContainerSingleton.m

#import "DataContainerSingleton.h"


@implementation DataContainerSingleton

@synthesize favourites, drinks;
@synthesize name, caffeine;

static DataContainerSingleton* _theDataContainerSingleton = nil;

+ (DataContainerSingleton*) theDataContainerSingleton;
{
    if (!_theDataContainerSingleton)
        _theDataContainerSingleton = [[DataContainerSingleton alloc] init];
    return _theDataContainerSingleton;
}

- (id)init
{
    self = [super init];
    if (self) 
    {
        self.favourites = [[[NSMutableArray alloc] init] autorelease];
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@end

Я проверил все зависимости в программе, ни одна из них не находится вне папки, которую я копирую. Я почистил и очистил папку сборки, но она по-прежнему печатает 0.

Кто-нибудь знает, что может быть причиной этого несоответствия? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Я послал ему свою половину, чтобы объединить с его половиной

Начните использовать программное обеспечение для контроля версий. Вы делаете вещи излишне трудными для себя. Сначала есть небольшая кривая обучения, но она окупается даже в вашем первом нетривиальном проекте.

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

  • Другой набор инструментов. Убедитесь, что вы используете одну и ту же версию Xcode с одинаковыми версиями всех SDK и т. Д.

  • Различные данные. Удалите приложение со своих устройств и повторите попытку.

  • Задержка файлов в комплекте. Установка версии разработки через XCode не удаляет старые файлы из пакета. У вас могут быть файлы в вашем комплекте, которые он не имеет, или наоборот. Удалите приложение со своих устройств и повторите попытку.

  • Различное оборудование. Иногда ошибки проявляются только на определенном оборудовании. Различные возможности устройства могут отправлять один и тот же код по разным путям. Вы оба попробуйте временно протестировать в симуляторе.

0 голосов
/ 17 октября 2011

Я думаю, что упомянутые вами "противоречивые результаты" могут быть связаны с тем, что вы, возможно, установили соединение в Интерфейсном Разработчике для delegate и dataSource вашего tableView с DataContainerSingleton, но вашу друга есть другая версия .xib, в которой это соединение отсутствует.Это не даст никаких ошибок или предупреждений компиляции, но представит себя как «ошибка», когда ни один из методов делегата или источника данных фактически не вызывается.Поскольку вы можете видеть операторы регистрации, я бы предположил, что delegate установлен правильно, но dataSource - это не ..?

Другой вариант заключается в том, что ваш метод cellForRowAtIndexPath возвращает новую ячейку каждыйвремя (без галочки, следовательно, вы можете только проверять, но никогда не снимать галочку).

РЕДАКТИРОВАТЬ: Чтобы быть более точным в этом, вы должны иметь код в cellForRowAtIndexPath по следующим строкам:

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:@"drinkCell"];
if(cell == nil) // we need to create a new one
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:@"drinkCell"];
}

if([tickedIndexPaths containsObject:indexPath])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

В противном случае, если у iPhone недостаточно памяти, ОС попросит приложение удалить все ненужные объекты из памяти, включая ваши существующие ячейки.Так, например, в следующий раз, когда вы перейдете к извлечению ячейки в строке 2, ей нужно будет создать новый объект UITableViewCell со значениями по умолчанию, что означает аксессуар None.В связи с этим вы должны явно устанавливать галочку каждый раз, когда получаете ячейку.

После просмотра вашего первого комментария: Хорошо.Вы должны убедиться, что вы не добавили дубликат indexPath.Если выбрана строка, убедитесь, что checkedIndexPaths не содержит путь, который вы собираетесь добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...