Использование currentViewController из UIView
Я создаю строку заголовка для моего приложения iOS, и я делаю это внутри UIView. Единственная проблема, с которой я столкнулся, - это "кнопка дома". Когда нажата кнопка "Домой", необходимо перейти на домашнюю страницу, которая является ViewController.
Однако, это выглядит не так, как будто [self presentViewController:vc animated:NO completion:NULL];
работает для UIView.
Как мне решить эту проблему?
- (void) createTitlebar {
CGRect titleBarFrame = CGRectMake(0, 0, 320, 55);
//Create the home button on the top right of the page. When clicked, it will navigate to the home page of the application
homeButton = [UIButton buttonWithType:UIButtonTypeCustom];
homeButton.frame = CGRectMake(275, 10, 40, 40);
[homeButton setTag:1];
[homeButton setImage:[UIImage imageNamed:@"homeIcon.png"] forState:UIControlStateNormal];
[homeButton addTarget:self action:@selector(homeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:homeButton];
}
- (IBAction)homeButtonPressed:(id)sender{
//Transition to the submit button page
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentViewController:vc animated:NO completion:NULL];
}
Ответы
Ответ 1
Только UIViewController может представить другой контроллер представления, поэтому, если вам нужно показать viewcontroller из представления, есть несколько способов, один из которых выглядит следующим образом:
создать диспетчер представлений, на котором расположено ваше родительское представление, его делегат
ParentView *view = [ParentView new];
...
view.delegate = self;
тогда внутри метода вызова ParentView этого делегата
- (IBAction)homeButtonPressed:(id)sender {
[self.delegate buttonPressed];
}
а затем внутри вашего VC-приложения
-(void)buttonPressed {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentViewController:vc animated:NO completion:NULL];
}
Если вам нужно сохранить этот код внутри UIView и избежать делегирования, вы можете сделать такой трюк (лично мне это не нравится, но он должен работать)
-(void)buttonPressed{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[(UIViewController*)self.nextResonder presentViewController:vc animated:NO completion:NULL];
}
Ответ 2
Вы можете сделать это, не используя шаблон делегата. Здесь вы идете
ObjectiveC
UIViewController *currentTopVC = [self currentTopViewController];
currentTopVC.presentViewController.........
- (UIViewController *)currentTopViewController {
UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
while (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}
return topVC;
}
Swift
var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
topVC?.presentViewController........
Ответ 3
Здесь более идиоматическая версия Свифт 3 версии Шамсудэна:
extension UIApplication {
static func topViewController() -> UIViewController? {
guard var top = shared.keyWindow?.rootViewController else {
return nil
}
while let next = top.presentedViewController {
top = next
}
return top
}
}
Затем вы можете просто позвонить:
UIApplication.topViewController()?.present(...)
Ответ 4
Вы можете попробовать под кодом
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UIViewController *vc1 = [UIApplication sharedApplication].keyWindow.rootViewController;
[vc1 presentViewController:vc animated:YES completion:nil];
Ответ 5
С Swift 4 - 4.2 Добавление на Shamsudheen TK ответа.
var topVC = UIApplication.shared.keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
let customViewController = CustomViewController()
topVC?.present(customViewController, animated: true, completion: nil)
С UINavigationController: здесь также есть дополнительная функция → Вы можете передать UINavigationController с помощью вашего customViewController.
var topVC = UIApplication.shared.keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
let customViewController = CustomViewController()
let navController = UINavigationController(rootViewController: CustomViewController)
topVC?.present(navController, animated: true, completion: nil)