你能从UITableViewDataSource函数中访问应用程序委托吗?

时间:2009-05-03 14:55:55

标签: iphone objective-c cocoa-touch

我正在试图找出iPhone的SQLite功能,而且我在从重写的UITableViewDataSource函数中读取数据库文件时遇到了一些问题。我在我的应用程序委托中将数据库文件位置存储在ivar(作为NSString)中,但是当我尝试从重写的UITableViewDataSource函数访问该字符串时,它返回一些其他对象。如果我从任何类自己的实例方法访问字符串,它工作正常。

有没有办法从覆盖的UITableViewDataSource函数中访问应用程序委托?

4 个答案:

答案 0 :(得分:75)

应用程序是一个单例,它维护对app委托的引用。您始终可以使用以下方式访问您的应用代表:

[UIApplication sharedApplication].delegate

您可能需要将返回值转换为您自己的app委托类以消除警告。更好的是,编写一个返回你的upcast app delegate的访问器:

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

答案 1 :(得分:22)

Roger是正确的,但我个人觉得在同一语句中混合使用点语法和括号语法非常困惑。

如果这也让您感到困惑,那么仅使用括号表示法的等效语法是:

[[UIApplication sharedApplication] delegate];

是的,您可能需要将结果转换为您的应用程序委托类,而不是通用的UIApplicationDelegate类,否则您很可能会得到许多编译器警告。

答案 2 :(得分:8)

虽然我不喜欢将太多太多地粘贴到我的AppDelegate中,但我经常需要访问它才能在我的应用程序中找到其他单例,这使得方法调用+ cast变得有点麻烦。因此,在我的大多数应用程序中,我将在我的全局头文件中定义一个快速宏。

示例如下:


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

引用MY_DELEGATE要容易得多。

答案 3 :(得分:1)

问题证明非常简单。我创建了NSString来使用stringByAppendingPathComponent保存我的数据库文件的路径:。我没有意识到这将是自动释放的,所以我没有费心去明确地保留它。这是因为它返回了一个不同类型的对象是因为一旦字符串被自动释放,该内存就被重用了。

明确保留保存数据库文件路径的字符串解决了这个问题。