我正在尝试了解Objective-C中的委托,并且在转移过程中丢失数据的变量存在一个小问题。我的Class1包含$("#FormId").validate().element('#FieldId');
。数组被填充,然后我想将数组的值传递给Class2,并显示它。以下是Class1中的相关代码:
NSMutableArray
现在,这就是我在Class2中所拥有的:
//Class1.h
@class Class1;
// define the protocol for the delegate
@protocol Class1Delegate
@required
-(void)sayHello:(Class1 *)customClass withAntArray:(NSMutableArray *)antArray;
@end
@interface Class1 : MySuperClassName
@property (nonatomic, assign) id delegate;
-(void)helloDelegate;
@end
//Class1.m:
@interface Class1 ()
@property (nonatomic, strong) NSMutableArray *antOccurenceTimes;
@end
@implementation Class1
@synthesize antOccurenceTimes;
-(void)helloDelegate
{
// send the message to the delegate
[_delegate sayHello:self withAntArray:self.antOccurenceTimes];
}
#import "Class1.h"
@interface Class2 : UIView <Class1Delegate>
@end
// Class2.m:
- (void)appropriateTimeToCallMethod {
Class1 *initAntMarks = [[Class1 alloc] init];
initAntMarks.delegate = self;
[initAntMarks helloDelegate];
}
-(void)sayHello:(Class1 *)customClass withAntArray:(NSMutableArray *)antArray {
NSLog(@"Hello! %@", antArray.description);
}
读为“NULL”。现在,我认为它显然是null,因为我只是在调用所需方法之前创建了一个全新的类实例。我觉得我可能有些混淆,对代表团这么新,我不确定到底是什么。有谁知道我需要调整以利用代表团?
我忘了添加我在Class1中初始化它,并且它填充得很好。这种情况只发生在第二阶段。
我在下面的代码段中的ClassA中的单独方法中初始化antOccuranceTimes,并且NSLog会触发两次......
antArray.description
答案 0 :(得分:1)
您尚未初始化antOccurenceTimes
。因为它是零。根据您的需要,有很多选择。例如,您可以在init
函数中初始化它:
- (instancetype)init {
self = [super init];
if( self ) {
antOccurenceTimes = [NSMutableArray array];
[antOccurenceTimes addObject:@"Hello World"];
}
}
或者在调用委托函数之前初始化它。
-(void)helloDelegate
{
// send the message to the delegate
self.antOccurenceTimes = [NSMutableArray array];
[self.antOccurenceTimes addObject:@"Hello World"];
[_delegate sayHello:self withAntArray:self.antOccurenceTimes];
}
我想你明白我的观点。
答案 1 :(得分:1)
更改此行:
@property (nonatomic, assign) id delegate;
到:
@property (nonatomic, weak) id <Class1Delegate> delegate;
assign
应仅用于C基元,而不是Objective-c对象引用。在传递委托之前,您还应该检查您的对象是否实际符合委托。
修改强>
我认为你可能会对代表团的目的感到困惑。
Class1 *initAntMarks = [[Class1 alloc] init];
initAntMarks.delegate = self;
[initAntMarks helloDelegate];
为什么在一个对象上调用一个方法,当你只需创建一个返回NSMutableArray
的方法时,该方法又调用一个委托方法?当前设置代码的方式要求在调用-helloDelegate
之前,必须使用适当的对象填充数组。 MVC中委托的目的是通知对象发生在另一个对象内部的事件。您将任务“委托”给另一个对象,或者您可以说,另一个对象是否负责完成任务。阅读Apple Docs on Delegation。代码中的委托不是正确的实现模式,正如我所说,你可以简单地通过方法调用返回该数组。
编辑2:
通过属性方法或通过返回数组的显式方法,有两种方法可以实现此目的。如果选择使用属性方法,则属性声明必须位于公共接口(即.h
文件中),以便在实现对象时,您的类可以使用所有访问器。
//Inside the .h
@property (nonatomic, strong) NSMutableArray *antOccurenceTimes;
这将自动为您提供antOccurenceTimes
属性的两种访问方法。这些是getter -antOccurenceTimes
和setter -setAntOccurenceTimes:
方法。现在,在初始化类并填充数组后,您可以调用-antOccurenceTimes
来返回数组。
您还可以创建一个返回数组的显式方法:
- (NSMutableArray *)hello{
//Do something here
return _antOccurenceTimes;
}