- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的 AppDelegate.m
中有一个名为 message
的变量,我想在 View Controller 中使用它,但它不起作用。我试过这个解决方案:
AppDelegate.m
导入我的 ViewController.m
,我会得到一个错误:clang: error: linker command failed with exit code 1 (使用 -v 查看调用)
,但如果我不导入它,我会得到这个:No known class method for selector 'message'
at this line: self.toSort = [AppDelegate 消息];
.但是当我将 ViewController.m
导入 AppDelegate.m
时,我没有收到链接器命令错误,但是其他错误已经存在。 我的AppDelegate.h
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) PNChannel *myChannel;
- (void)getMessage;
AppDelegate.m
#import "AppDelegate.h"
#import "ViewController.m"
static NSArray *_message = nil;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// [self.window makeKeyAndVisible];
self.myChannel = [PNChannel channelWithName:currentChannel.username
shouldObservePresence:YES];
[self getMessage];
}
+ (NSArray *)message
{
if (_message)
return _message;
AppDelegate *appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate getMessage];
return nil;
}
- (void)getMessage {
[PubNub requestFullHistoryForChannel:self.myChannel withCompletionBlock:^(NSArray *contentArray, PNChannel *channel, PNDate *fromDate, PNDate *toDate, PNError *error) {
_message = contentArray;
NSLog(@"test log %@", _message);
}];
}
ViewController.m
#import "ViewController.h"
//#import "AppDelegate.h"
//#import "AppDelegate.m"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
//AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
//[appDelegate getMessage];
self.toSort = [AppDelegate message];
[self getMessageList];
}
我确定我犯了一些初学者错误,但我想不通。 “测试日志”有效,所以我想我必须以不同的方式调用它。
已经试过了,但是还是报错,因为 message 不是一个属性。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *variableTest = appDelegate.message;
NSLog(@"TEST : %@",variableTest);
更新:我试过了,但是测试日志显示为空,所以还是有问题。
AppDelegate.h
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) PNChannel *myChannel;
@property (strong, nonatomic) NSArray *message;
- (void)getMessage;
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// [self.window makeKeyAndVisible];
self.myChannel = [PNChannel channelWithName:currentChannel.username
shouldObservePresence:YES];
[self getMessage];
}
return YES;
}
+ (NSArray *)message
{
if (self.message)
return self.message;
AppDelegate *appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate getMessage];
return nil;
}
- (void)getMessage {
[PubNub requestFullHistoryForChannel:self.myChannel withCompletionBlock:^(NSArray *contentArray, PNChannel *channel, PNDate *fromDate, PNDate *toDate, PNError *error) {
self.message = contentArray;
NSLog(@"dev log %@", self.message);
}];
}
ViewController.m
- (void)viewWillAppear:(BOOL)animated {
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *variableTest = appDelegate.message;
NSLog(@"TEST : %@",variableTest);
}
我的尝试基于 o Pi 的回答:
@interface MessageHistoryData : NSObject {
NSArray *yourData;
}
@property(nonatomic,retain) NSArray *yourData;
+(MessageHistoryData *)getInstance;
@end
#import "MessageHistoryData.h"
@implementation MessageHistoryData @synthesize yourData;
static MessageHistoryData *instance =nil;
+(MessageHistoryData *)getInstance {
@synchronized(self) {
if(instance==nil) {
instance= [MessageHistoryData new];
}
}
return instance;
}
@end
在我的ViewController.m中(MessageHistoryData导入到.h中)
-(void)setupArray{
[PubNub requestHistoryForChannel:my_channel from:nil to:nil limit:100 reverseHistory:NO withCompletionBlock:^(NSArray *contentArray, PNChannel *channel, PNDate *fromDate, PNDate *toDate, PNError *error) {
MessageHistoryData *data = [MessageHistoryData getInstance];
data.yourData = contentArray;
NSLog(@"Dev log2 %@", data.yourData);
}];
最佳答案
我设置了一个示例项目来验证它是否有效。
在AppDelegate.h文件中,公开声明message
属性和-getMessage
方法:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (readonly, nonatomic) NSString *message;
- (void)getMessage;
@end
在 AppDelegate.m 文件中,像往常一样实现您的方法(为了举例,我明确设置了该属性):
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (void)getMessage {
self.message = @"This is a message";
}
@end
在您的 ViewController.m
文件中,您应该导入 AppDelegate header ,并且您应该可以自由访问属性:
#import "AppDelegate.h"
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSLog(@"The delegate's message is: %@", delegate.message); // Logs "The delegate's message is: (null)"
[delegate getMessage];
NSLog(@"The delegate's message is: %@", delegate.message); // Logs "The delegate's message is: This is a message"
}
@end
如果上述方法不起作用,您应该测试您的 PubNub
类并确保它的行为是可预测的。
我不建议永远在您的 AppDelegate 中存储信息,因为这会使该类负责做更多的事情,而不仅仅是作为您的应用程序对系统的委托(delegate)。此类信息应存储在专用存储中,或通过自定义 PubNub
子类提供,该子类作为单例访问(如果没有要管理的全局状态!)或逐个实例访问。
如果您需要任何说明或者上述解决方案是否不适合您,请告诉我。
编辑:单例建议
根据我的评论,这是处理跨 View Controller 共享网络数据的一种方法
@interface NetworkClient : PubNub
@property (readonly, nonatomic) NSString *message;
/**
* Returns a shared network client to be used throughout the app
*/
+ (instancetype)sharedClient;
- (void)configureWithChannel:(PNChannel*)channel;
- (void)clearChannel;
- (void)getMessagesWithCompletionHandler:(void (^)(NSArray *, PNChannel *, PNDate *, PNDate *, PNError *))
@end
sharedInstance 使用 technique described here 的地方设置您的实例。从那里,您可以使用 [NetworkClient sharedClient]
访问客户端,并通过客户端上的实例方法或属性检索任何数据。
我还猜测您通常是单例或 iOS 的新手,所以我建议您阅读 this article关于使用单例和博客 objc.io熟悉一些绝对会让您的生活更轻松的最佳实践。
关于ios - 无法从 AppDelegate 调用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433895/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!