Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

[UIApplication sharedApplication].delegate

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

#pragma mark access to app delegate etc.
+ (MyAppDelegateClass*) sharedAppDelegate; {
    return (MyAppDelegateClass*)[[UIApplication sharedApplication] delegate];
}

Ответ 3

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

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

[[UIApplication sharedApplication] delegate];

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

Ответ 4

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

Пример:


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

Гораздо проще обратиться к MY_DELEGATE.