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

jam*_*mur 32 iphone cocoa-touch objective-c

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

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

Rog*_*Rog 75

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

[UIApplication sharedApplication].delegate
Run Code Online (Sandbox Code Playgroud)

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

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


mmc*_*mmc 22

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

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

[[UIApplication sharedApplication] delegate];
Run Code Online (Sandbox Code Playgroud)

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


Jus*_*rls 8

虽然我不喜欢在我的AppDelegate中过多地使用它,但我经常需要访问它以获取我的应用程序中的其他单例,这使得方法调用+转换有点麻烦.因此,在我的大多数应用程序中,我将在我的全局头文件中定义一个快速宏.

示例如下:


#define MY_DELEGATE (AppDelegate*)[[UIApplication sharedApplication] delegate]
Run Code Online (Sandbox Code Playgroud)

引用它要容易得多MY_DELEGATE.

  • 这非常有用.但是当我看到人们用"我的"为前缀添加东西时,我的眼睛开始流血.我无法想象还有谁会拥有它......而且,我不确定为什么你需要`AppDelegate`来访问单身人士.单例被访问,如`[[MyHowdyClass sharedHowdyer] someMethod]`.不需要"AppDelegate". (2认同)
  • (1)如果它保存任何面部,我也鄙视标识符中的"我的".为了便于说明,我写了"我的"来替换我的应用程序的首字母 - 我的实际上是"QM_DELEGATE".你的"MyHowdyClass"也做到了这一点;)(2)你应该直接访问(设计模式)单身人士是完全正确的 - 我过度简化了; 我应该说"共享实例"或其他东西来表示我的整个应用程序只使用一个实例的第三方类.它本身不是一个单身人士,但并不总是值得包装.在这种情况下,将它放在AppDelegate上以便于访问是很方便的. (2认同)

jam*_*mur 1

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

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