несовместимые типы указателей, присваиваемые nsarray из nsdictionary - PullRequest
1 голос
/ 25 октября 2011

Я новичок в разработке для iPhone и добился большого успеха с ответами отсюда, поэтому я надеюсь получить помощь напрямую. Я читаю данные в таблицу из списка. Приложение работает нормально, но я получаю 2 предупреждения при компиляции. Я знаю, почему я получаю ошибки, но мне не удалось решить проблемы. Хотя это приложение работает, я действительно хотел бы эффективно устранить предупреждения. Когда я попытался изменить NSDictionary на NSArray, предупреждение исчезло, но таблица больше не заполнена.

Любая помощь будет принята с благодарностью.

Персонал и данные определены как NSArray в файле .h Делегата. Предупреждения отображаются в файле делегата .m ниже.

Мой делегат имеет следующее:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window

NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"Data.plist"];
NSString *SPath = [[NSBundle mainBundle] bundlePath];
NSString *StaffPath = [SPath stringByAppendingPathComponent:@"Staff.plist"];

NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
**self.data = tempDict;**
[tempDict release];


    NSDictionary *staffDict = [[NSDictionary alloc]initWithContentsOfFile:StaffPath];
    **self.staff = staffDict;**  
    [staffDict release];

В моем штате ViewController у меня есть следующее:

    if(CurrentLevel == 0) {

        //Initialize our table data source
        NSArray *staffDict = [[NSArray alloc] init];
        self.tableDataSource = staffDict;
        [staffDict release];


        Midwest_DigestiveAppDelegate *AppDelegate = (Midwest_DigestiveAppDelegate *)[[UIApplication sharedApplication] delegate];
    self.tableDataSource = [AppDelegate.staff valueForKey:@"Rows"];     
}
else 
    self.navigationItem.title = CurrentTitle;   

Ответы [ 2 ]

1 голос
/ 25 октября 2011

NSArray содержит одномерный список элементов, где NSDictionary отображает ключи на значения.

Массив:

[a, b, c]

Словарь:

{@ "a" = @ "первый элемент", @ "b" = @ "второй элемент"}

Не могли бы вы объявить данные как NSDictionary *data; и заполните его как data = [[NSDictionary alloc] initWithContentsOfFile:DataPath];

Затем вы получите доступ к значениям в словаре с помощью [data valueForKey:@"key"]

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

Все в вашем коде говорит о том, что свойства staff и data являются экземплярами NSDictionary.Вы инициализируете их для объектов словаря и ссылаетесь на них как на объекты словаря.Почему тогда вы объявляете их объектами NSArray?

Вы должны изменить способ их объявления, чтобы они являлись NSDictionary в вашем заголовочном файле, а не NSArray.Это кажется мне наиболее логичным способом удаления ваших предупреждений.

Это все еще должно работать, предполагая, что содержимое вашего "штата" NSDictionary имеет ключ с именем "Rows", значением которого является NSArray.Код, который вы должны инициализировать self.tableDataSource с пустым NSArray, кажется избыточным, так как вы сразу перезаписываете значение строкой

self.tableDataSource = [AppDelegate.staff valueForKey:@"Rows"];  

в вашем коде

...