我对 iOS 开发有点陌生,来自 Java / Android 背景。我的理解是,您的习惯Protocols
或Delegates
就像Interfaces
在 Java 土地上一样。
如果是这样,那么我相信这些Protocols
也是Objects
如此。
案子:
- 假设 2
ViewController
秒,Home
并且Profile
。 - 1
Presenter
,我们称它在两个sStuffPresenter
中单独实例化。ViewController
StuffPresenter
有一个被调用的初始化方法initWithInteractor
,它接受一个参数,Interactor
该参数是一个协议。- Home 和 Profile 都实现了一个
Protocol
名为 Interactor,它有一个名为 的方法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
应用程序崩溃时,因为initStuffInTableView
正在被调用Home
。为什么会这样?