是否可以在viewcontroller的另一部分中重用viewcontroller?

时间:2016-12-24 15:31:31

标签: swift uiviewcontroller uicollectionview uicollectionviewlayout

我希望能够使用相同的布局和视图控制器,但在应用程序的不同部分使用不同的数据集。这是否可以在不必创建另一个单独的viewcontroller的情况下实现?

因为在我的viewDid加载中,我已经调用了针对该特定viewcontroller的API请求...是否有办法明确设置应该在哪个viewcontroller上使用的开关案例?

我正在使用故事板和导航控制器中的堆栈层次结构,看起来类似于:

V1 - > V2 - > V3 - > V4

所以这个想法是......相同的布局和不同的数据。 V1和V4应该具有相同的确切布局。但数据集会有点不同。 V1设置正确,工作正常。

这是一个segue问题吗?或者是其他东西?谢谢 !!很有意思!!

1 个答案:

答案 0 :(得分:2)

请不要创建几乎完全相同的2个UIViewControllers。

有几种方法可以解决您的问题。但是,既然您正在使用故事板和分段,我们就是这样做的。

在V1控制器中创建一个传入应加载的数据类型的方法。像这样:

目标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
}

现在在prepareForSegue方法的V3中执行此操作:

- (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)
}