编辑:为清晰起见而编辑
免责声明:我是新人,非常糟糕。但我已经非常努力地阅读了很多东西来解决这个问题,但我还没有......
我认为我的整个委托模式都可以工作,除了我无法弄清楚如何在MatchLetter类中将ViewController的委托属性设置为self。原因是因为我无法弄清楚如何在那里调用代码。它不是视图控制器,因此viewDidLoad或prepareForSegue不起作用。
这就是我所拥有的:
ViewController.h
#import <UIKit/UIKit.h>
@class ViewController;
@protocol letterMatchProtocol <NSObject>
- (BOOL) isLetterMatch:(char) firstLetter;
@end
@interface ViewController : UIViewController
@property (nonatomic, weak) id <letterMatchProtocol> delegate;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
char c = 'a';
// This is the method I want to delegate to MatchLetter, to have a BOOL returned
BOOL returnValue = [self.delegate isLetterMatch:c];
}
@end
MatchLetter.h
#import <Foundation/Foundation.h>
#import "ViewController.h"
@interface Delegate : NSObject <letterMatchProtocol>
@end
MatchLetter.m
#import "MatchLetter.h"
@implementation Delegate
// this is the code I think I need to run here, to set the delegate property...
// ViewController *viewController = [ViewController new];
// viewController.delegate = self;
// ... so that isLetterMatch can be run here from ViewController.m
// But I don't know where to put this code, or how to get it to run before the ViewController
// especially since there are no segues or views to load.
- (BOOL) isLetterMatch:(char)firstLetter {
if (firstLetter == 'a') {
return YES;
}
else {
return NO;
}
}
@end
有人可以告诉我最好的方法吗?感谢您的阅读
答案 0 :(得分:1)
你问“在哪里设置委托=自我?或者我应该使用不同的设计模式?”。
答案:不要。一个对象永远不应该是它自己的委托。
你的代码非常混乱。
不要将类命名为“Delegate”。代表是一种设计模式。委托的全部意义在于,任何符合特定协议(“说出语言”)的对象都可以作为委托。您不需要知道什么类的对象作为委托,但只是它说出您需要的语言。
类比:当您致电操作员时,您并不关心谁在操作台上工作。你不关心他/她的性别,宗教,种族背景,他们的身高等等。你只关心他们说你的语言。
同样,当您设置委托时,将哪种类型的对象设置为委托并不重要。重要的是作为委托的对象符合该委托的协议。
只要该对象符合UITableViewDelegate协议,表视图就可以将任何对象作为其委托。您通常会将视图控制器视为表视图的委托,但您不必这样做。您可以创建一个管理表视图的自定义类,并将其作为委托。没有“TableViewDelegate”对象类。而是一个UITableViewDelegate
协议,任何符合协议的对象都可以作为表视图的委托。
编辑:您的问题令人困惑。我认为你提出的是你的Delegate类会创建一个视图控制器并使自己成为视图控制器的委托。
如果这就是你在说什么,你的想法是倒退的。视图控制器使用Delegate类作为帮助程序类。视图控制器类的任何给定实例都可以创建Delegate类的实例,并根据需要将其设置为委托。您可能一次有3个ViewController实例,每个实例都有自己的Delegate类实例。
因此,ViewController对象是应该创建和设置Delegate实例的对象,如果需要的话:
- (void) viewDidLoad;
{
self.delegate = [[Delegate alloc] init];
//other setup here
}