我想这是一个初学者问题,所以感谢您的耐心等待:
在viewControllerA中,我从viewControllerB调用了很多方法。
目前我正在使用
viewcontrollerB * vcB= [[viewcontrollerB alloc] init];
[vcB doSomething];
我在ViewControllerA中一遍又一遍地这样做,这感觉很蠢。
那么这里最好的方法是什么?
我可以使viewControllerB成为viewControllerA的一个属性吗? 我应该使用委托方法,如果是,如何使用?
期待您的见解
答案 0 :(得分:0)
嗯,实际上可能存在与您的设计方法相关的一些问题。虽然您没有指定这两个视图控制器之间的实际关系,但即使在这种情况下,我也会说是,您可以将第二个视图控制器作为第一个视图控制器的属性。 如果您更好地描述了您执行的操作类型以及这两个视图控制器之间的关系,您可以期待更详细和更广泛的答案。 似乎您的第二个视图控制器实际上没有在屏幕上显示,您只是重用其一些业务方法。这不是它应该的方式。您应该在其他一些类中解耦这些方法,这些类封装了特定的共享业务行为。
我还建议你通过MVVM设计模式得到认可,解决了这些以及更多其他类型的问题:https://www.objc.io/issues/13-architecture/mvvm/
答案 1 :(得分:0)
您可以使用委托。
在ViewControllerB.h中:
@protocol ViewControllerBDelegate <NSObject>
-(void)doSomething;
@end
@interface ViewControllerB : UIViewController
@property (nonatomic, weak) id <ViewControllerBDelegate> delegate;
@end
在ViewControllerB.m
中-(void)someMethod {
if ([self.delegate respondsToSelector:@selector(doSomething)]) {
[self.delegate doSomething]; // will call delegate implement in delegate object.
}
}
在ViewControllerA中:
ViewControllerB *vcB = [[ViewControllerB alloc] init];
vcB.delegate = self;
#pragma mark - ViewControllerBDelegate
-(void)doSomething {
//...
}
当你想在ViewControllerA中做某事时,你应该在ViewControllerB中调用[self.delegate doSomething]
;