是否可以在 viewcontroller 的另一部分重复使用 viewcontroller?
Is it possible to reuse a viewcontroller in another part of a viewcontroller?
我希望能够使用相同的布局 viewcontroller 但在应用程序的不同部分使用不同的数据集。这是否可能而无需创建另一个单独的 viewcontroller?
因为在我的 viewDid 加载中,我已经在调用 API 请求特定的 viewcontroller... 是否有一种方法可以明确设置 [=25] 的开关盒=] 应该开着?
我在导航控制器中使用故事板和堆栈层次结构,看起来与此类似:
V1 --> V2 --> V3 --> V4
所以我的想法是...相同的布局但不同的数据。 V1 和 V4 应具有完全相同的布局。但是数据集会有点不同。 V1 已正确设置并且工作正常。
这是一个segue问题吗?或者是其他东西?谢谢 !!非常感谢!!
请不要创建 2 个几乎完全相同的 UIViewController。
有几种方法可以解决您的问题。但由于您使用的是 Storyboard 和 segues,我们将这样做。
在您的 V1 控制器中创建一个方法来传入应加载的数据类型。像这样:
Objective-C
// 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
}
现在在 V3 的 prepareForSegue
方法中执行此操作:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[V1 class]]) {
V1 *vc1 = (V1 *)segue.destinationViewController;
[vc1 setupForDataType:DataTypeTwo];
}
}
Swift 3
// 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)
}
我希望能够使用相同的布局 viewcontroller 但在应用程序的不同部分使用不同的数据集。这是否可能而无需创建另一个单独的 viewcontroller?
因为在我的 viewDid 加载中,我已经在调用 API 请求特定的 viewcontroller... 是否有一种方法可以明确设置 [=25] 的开关盒=] 应该开着?
我在导航控制器中使用故事板和堆栈层次结构,看起来与此类似:
V1 --> V2 --> V3 --> V4
所以我的想法是...相同的布局但不同的数据。 V1 和 V4 应具有完全相同的布局。但是数据集会有点不同。 V1 已正确设置并且工作正常。
这是一个segue问题吗?或者是其他东西?谢谢 !!非常感谢!!
请不要创建 2 个几乎完全相同的 UIViewController。
有几种方法可以解决您的问题。但由于您使用的是 Storyboard 和 segues,我们将这样做。
在您的 V1 控制器中创建一个方法来传入应加载的数据类型。像这样:
Objective-C
// 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
}
现在在 V3 的 prepareForSegue
方法中执行此操作:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[V1 class]]) {
V1 *vc1 = (V1 *)segue.destinationViewController;
[vc1 setupForDataType:DataTypeTwo];
}
}
Swift 3
// 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)
}