Можете ли вы получить доступ к делегату приложения из функции UITableViewDataSource? - PullRequest
32 голосов
/ 03 мая 2009

Я пытаюсь выяснить функциональность SQLite для iPhone, и у меня возникают некоторые проблемы при чтении файла базы данных из переопределенной функции UITableViewDataSource. Я храню расположение файла базы данных в ivar (как NSString) в моем делегате приложения, однако, когда я пытаюсь получить доступ к этой строке из переопределенной функции UITableViewDataSource, он возвращает некоторый другой объект. Если я получаю доступ к строке из любого из методов собственного экземпляра классов, она работает нормально.

Есть ли способ получить доступ к делегату приложения из переопределенных функций UITableViewDataSource?

Ответы [ 4 ]

75 голосов
/ 03 мая 2009

Приложение - это одноэлементное приложение, которое поддерживает ссылку на делегат приложения. Вы всегда можете получить доступ к своему делегату приложения, используя:

[UIApplication sharedApplication].delegate

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

#pragma mark access to app delegate etc.
+ (MyAppDelegateClass*) sharedAppDelegate; {
    return (MyAppDelegateClass*)[[UIApplication sharedApplication] delegate];
}
22 голосов
/ 04 мая 2009

Роджер прав, но мне лично очень сложно смешивать точечный синтаксис и скобочный синтаксис в одном и том же утверждении.

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

[[UIApplication sharedApplication] delegate];

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

8 голосов
/ 11 октября 2009

Хотя мне не нравится слишком сильно вставлять в мой AppDelegate, мне часто требуется доступ к нему, чтобы получить доступ к другим синглетам в моем приложении, что делает вызов метода + приведение к использованию немного громоздким. Поэтому в большинстве моих приложений я определю быстрый макрос в моем глобальном заголовочном файле.

Пример следующий:


#define MY_DELEGATE (AppDelegate*)[[UIApplication sharedApplication] delegate]

Гораздо проще сослаться на MY_DELEGATE.

1 голос
/ 04 мая 2009

Проблема оказалась действительно простой. Я создал NSString для хранения пути к файлу моей базы данных, используя stringByAppendingPathComponent:. Я не смог понять, что это будет автоматически выпущено, и поэтому я не удосужился явно сохранить его. Причина, по которой он возвращал объект другого типа, заключалась в том, что эта память использовалась повторно после автоматического освобождения строки.

Явное сохранение строки, содержащей путь к файлу базы данных, решило проблему.

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