我希望能够使用相同的布局和视图控制器,但在应用程序的不同部分使用不同的数据集。这是否可以在不必创建另一个单独的viewcontroller的情况下实现?
因为在我的viewDid加载中,我已经调用了针对该特定viewcontroller的API请求...是否有办法明确设置应该在哪个viewcontroller上使用的开关案例?
我正在使用故事板和导航控制器中的堆栈层次结构,看起来类似于:
V1 - > V2 - > V3 - > V4
所以这个想法是......相同的布局和不同的数据。 V1和V4应该具有相同的确切布局。但数据集会有点不同。 V1设置正确,工作正常。
这是一个segue问题吗?或者是其他东西?谢谢 !!很有意思!!
答案 0 :(得分:2)
请不要创建几乎完全相同的2个UIViewControllers。
有几种方法可以解决您的问题。但是,既然您正在使用故事板和分段,我们就是这样做的。
在V1控制器中创建一个传入应加载的数据类型的方法。像这样:
// In .h file
typedef enum : NSUInteger {
DataTypeOne,
DataTypeTwo
} DataType;
- (void)setupForDataType:(DataType) type;
在V1中,您必须将调用API的逻辑从viewDidLoad移动到该新方法中。类似的东西:
// In .m file
@property(nonatomic, assign) BOOL didFetchData;
- (void)setupForDataType:(DataType) type {
self.didFetchData = YES;
switch (type) {
case DataTypeOne:
// some API call
break;
case DataTypeTwo:
// another API call
default:
break;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
if (self.didFetchData) { return; }
// make default API call
}
现在在prepareForSegue
方法的V3中执行此操作:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[V1 class]]) {
V1 *vc1 = (V1 *)segue.destinationViewController;
[vc1 setupForDataType:DataTypeTwo];
}
}
// In V1
enum DataType {
case one
case two
}
fileprivate var didFetchData = false
func setup(for dataType: DataType) {
didFetchData = true
switch dataType {
case .one:
// some API call
case .two:
// another API call
}
}
func viewDidLoad() {
super.viewDidLoad()
if didFetchData { return }
// make default API call
}
在V3 prepareForSegue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let v1 = segue.destination as? V1 else { return }
v1.setup(for: .two)
}