2010-03-03 2 views
0

Я пытаюсь получить доступ к NSMutableArray, который является членом данных моего класса AppDelegate. Он синтезируется в реализации и представляет собой массив пользовательского класса, который имеет член данных «имя» NSString.Каков правильный способ доступа к локальным переменным в делегате?

настоящее время я использую его, чтобы заполнить таблицу View (подвид), как это:

cell.textLabel.text = [[[delegate contentArray] objectAtIndex:indexPath.row] name]; 

Это работает, но я получаю предупреждение:

warning: no '-contentArray' method found 

Он не будет компилировать как:

cell.textLabel.text = [[delegate.contentArray objectAtIndex:indexPath.row] name]; 

я получаю это в этом случае:

error: request for member 'contentArray' in something not a structure or union 

Каков правильный способ доступа к массиву в делегате?

Обновление: Чтобы объявить delegate, в заголовочном файле контроллер вида таблицы, я включаю @class MainAppDelegate; и в @interface Заявляет элемент MainAppDelegate *delegate; данных. В контроллере табличного представления @implementation я делаю @synthesize delegate;.

+0

Что такое 'делегат'? Как это объявлено? – Chuck

+0

Я обновил сообщение. I @synthesize делегат из класса контроллера представления, где он определяется с использованием основного типа класса AppDelegate. –

+0

Локальная переменная находится только в области видимости в методе, а классы не имеют «членов данных». Я считаю, что вы думаете об переменной экземпляра, которую вы открыли через свойство. –

ответ

1

Я думаю, что решил. Заголовочный файл MainAppDelegate.h не был импортирован в файл .m-файла контроллера табличного представления. Думаю, для меня нет смысла иметь как основной файл AppDelegate.h, так и файл ViewController.h в представлении таблицы, оба импортируют друг друга.

+0

Это не большая сделка. MainAppDelegate должен знать о ViewController, и ViewController должен знать о MainAppDelegate. Вид сложной круговой зависимости, но это красота #import. – alesplin

0

Вы должны направить делегат на правильный тип. Например:

cell.textLabel.text = [[[(MyAppDelegate*) delegate contentArray] 
    objectAtIndex:indexPath.row] name] 
1

delegate Чтобы объявить, в заголовочном файле контроллер вида таблицы, я включаю @class MainAppDelegate; и в @interface я объявить [п] переменный экземпляр MainAppDelegate *delegate;. В контроллере табличного представления @implementation я делаю @synthesize delegate;.

Таким образом, вы указали имя класса MainAppDelegate и использовали его для объявления переменной экземпляра. Поскольку вы @synthesizing свойство, я предполагаю, что вы тоже объявили об этом.

настоящее время я использую его, чтобы заполнить таблицу View (подвид), как это:

cell.textLabel.text = [[[delegate contentArray] objectAtIndex:indexPath.row] name]; 

Это работает, но я получаю предупреждение:

warning: no '-contentArray' method found 

It не компилируется как:

cell.textLabel.text = [[delegate.contentArray objectAtIndex:indexPath.row] name]; 

я получаю это в этом случае:

error: request for member 'contentArray' in something not a structure or union 

Это потому, что компилятор не знает, какие методы или свойства delegate имеет. Вы объявили имя своего класса, но компилятор ничего не знает об этом, потому что вы не предоставили @interface для этого класса.

Решение: #import файл заголовка для класса делегата в файл реализации контроллера контроллера табличного вида, возможно, сразу после #import с собственным заголовком класса контроллера таблицы.

Кроме того, я подозреваю, что массив более правильно относится к контроллеру табличного представления, чем к делегату приложения, но я не знаю достаточно о Cocoa Touch, чтобы сказать наверняка.

+0

Это помогает мне понять * почему * недостающий файл заголовка вызвал проблемы. Я больше привык к C/C++, в котором незадекларированный класс через #import мог бы вызывать ошибки, а не предупреждения. Что касается того, где находится contentArray, то я понимаю, что лучшее место для этих данных находится в AppDelegate, потому что таким образом несколько представлений могут получить доступ к данным сразу через AppDelegate. Каждый пример, который я видел, делает это. Я уверен, что есть другие способы. –

+0

Вы также получили бы ошибку в Objective-C, если бы у вас не было объявлено имя класса с '@ class'. С этим объявлением (которое необходимо иметь в заголовке класса, использующего объявленный класс), компилятор знает, по крайней мере, что это имя класса; он просто ничего не знает об этом классе, пока вы не дадите ему '@ interface' для него. –

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