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