是否可以在 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)
}