【发布时间】:2015-12-02 08:01:26
【问题描述】:
我对 iOS 开发有点陌生,来自 Java / Android 背景。我的理解是,您自定义的Protocols 或Delegates 就像Java 领域中的Interfaces。
如果是这样,那么我相信这些Protocols 也是Objects。
案例:
- 假设有 2 个
ViewControllers、Home和Profile。 - 1
Presenter,我们称之为StuffPresenter在ViewControllers 中单独实例化。 -
StuffPresenter有一个名为initWithInteractor的初始化方法,它接收一个参数为Interactor,这是一个协议。 - Home 和 Profile 都实现了一个名为 Interactor 的
Protocol,它有一个名为initStuffInTableView(NSMutableArray *)stuff的方法。
所以我有一个两难境地,如果我在 Home 和 StuffPresenter 中继信息,然后我切换到 Profile,StuffPresenter 在 Home 和 Profile 中加载内容。
为什么会这样?
这是我设置的代码:
协议
@protocol Interactor <NSObject>
- (void)initStuffInTableView:(NSMutableArray *)stuff;
@end
演示者
@interface Presenter : NSobject
- (id)initWithInteractor:(id<Interactor>)interactor;
- (void)loadStuff;
@end
@implementation {
@private
id<Interactor> _interactor;
}
- (id)initWithInteractor:(id<Interactor>)interactor {
_interactor = interactor;
return self;
}
- (void)loadStuff {
// Load stuff
NSMutableArray *stuff = // Init stuff in array...
[_interactor initStuffInTableView:stuff];
}
@end
首页
@interface HomeViewController : UITableViewController <Interactor>
- (void)initPresenter;
@end
@implementation {
@private
StuffPresenter *_stuffPresenter;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self initPresenter];
[self initPullToRefresh];
}
# pragma mark - init
- (void)initPresenter {
_stuffPresenter = [[StuffPresenter alloc] initWithInteractor:self];
}
- (void)initPullToRefresh {
// Init pull to refresh
// ...
[self.refreshControl addTarget:self
action:@selector(reloadStuff)
forControlEvents:UIControlEventValueChanged];
}
# pragma mark - Interactor
- (void)initStuffInTableView:(NSMutableArray *)stuff {
// Do some work
[self.tableView reloadData];
}
# pragma mark - reloadStuff
- (void)reloadStuff {
[_stuffPresenter loadStuff];
}
# pragma mark - TableView methods here
// TableView methods...
@end
个人资料
@interface ProfileViewController : UITableViewController <Interactor>
- (void)initPresenter;
@end
@implementation {
@private
StuffPresenter *_stuffPresenter;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self initPresenter];
}
# pragma mark - init
- (void)initPresenter {
_stuffPresenter = [[StuffPresenter alloc] initWithInteractor:self];
[_stuffPresenter loadStuff];
}
# pragma mark - Interactor
- (void)initStuffInTableView:(NSMutableArray *)stuff {
// Do some work
[self.tableView reloadData];
}
# pragma mark - TableView methods here
// TableView methods...
@end
问题:
当我转到 Profile 时,应用程序崩溃了,因为在 Home 中调用了 initStuffInTableView。为什么会这样?
【问题讨论】:
-
次要点:如果方法是调用
[super init..]的初始化程序,则它们只能以单词init开头。并且只能在初始分配/实例化期间调用它们。 -
谢谢你的意思,我习惯于在
Java中设置不同的构造函数,我如何在Objective C土地上最好地完成它?我的理解是我可以设置自定义initWith<key-word>方法。 -
啊,好吧,您指的是我的自定义初始化方法,例如
initPresenter、initPullToRefresh是的,这很有意义。 -
我认为我将这些方法命名为
setup<key-word>继续前进。
标签: ios objective-c protocols presenter