iOS开发 子视图中获取父控制器、父视图

Objective-C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
获取父控制器

@param view 当前视图
@param className 需要获取的控制器名称
@return 返回控制器对象
*/
- (UIViewController *)LCZGetSuperViewController:(UIView *)currentview superViewControllerClassName:(NSString *)className
{
for (UIView* next = [current superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[NSClassFromString(className) class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}

/**
获取当前视图中的目标父视图

@param currentView 当前视图
@param superView 父视图
@return 父视图对象
*/
- (UIView *)LCZGetSuperView:(UIView *)currentView superView:(UIView *)superView {
UIView *view = currentView.superview;
while (![view isKindOfClass:[superView class]]) {
if (view.superview == nil) {
return nil;
} else {
view = [view superview];
}
}
return view;
}

Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/// 通过当前视图获取父视图的控制器
///
/// - Parameters:
/// - currentView: 当前视图
/// - viewController: 需要获取到的控制器
/// - Returns: 返回控制器
func LCZGetSuperViewController<T: UIViewController>(currentView:UIView, viewController: T.Type) -> T? {
var view: UIView = currentView.superview!
while view.next!.isKind(of: T.self) != true {
guard view.superview != nil else {
return nil
}
view = view.superview!
}
return view.next as? T
}

/// 获取当前视图中的目标父视图
///
/// - Parameters:
/// - currentView: 当前视图
/// - superView: 目标父视图
/// - Returns: 返回父视图
public func LCZGetSuperView<T: UIView>(currentView: UIView, superView: T.Type) -> T? {
var view: UIView = currentView.superview!
while view.isKind(of: T.self) != true {
guard view.superview != nil else {
return nil
}
view = view.superview!
}
return view as? T
}
坚持原创技术分享,您的支持将鼓励我继续创作!