tabBarController и navigationControllers в альбомном режиме, эпизоде II

Вы не можете запретить производному классу объявлять конструкторы копирования / перемещения, но их нельзя использовать по умолчанию: ctor копирования по умолчанию или производный класс будут пытаться вызвать ctor копирования своей базы (то же самое для перемещения).

Но производный класс может явно построить свою базу с помощью ctor по умолчанию:

class DerivedClass : public BaseClass {
public:
  DerivedClass();
  DerivedClass(const DerivedClass &): BaseClass() {
      // copy ctor for the derived part
  }
  bool doSomething() override;
};

Et voila ... класс DerivedClass теперь копируемый, несмотря на то, что его базовый класс - нет!

6
задан Frank Krueger 14 June 2010 в 21:48
поделиться

5 ответов

Это сработало для меня:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}
4
ответ дан 8 December 2019 в 13:49
поделиться

Здесь ' s расширение к UITabBarController, которое делегирует вызовы shouldAutorotateToInterfaceOrientation текущему выбранному дочернему контроллеру. Используя это расширение, вам больше не нужно создавать подклассы UITabBarController, и вы можете использовать shouldAutorotateToInterfaceOrientation в своих контроллерах, как и следовало ожидать.

UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITabBarController + Autorotate.m

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end
7
ответ дан 8 December 2019 в 13:49
поделиться

Я могу использовать это уже некоторое время (из контроллера панели вкладок моего приложения) без проблем:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

Таким образом, в соответствующем VC, мы можем сделать реальная проверка, в данном случае для просмотра фотогалереи (что еще?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Вид моей галереи даже не находится на вершине стека для данного контроллера навигации. Он все еще вызывается.

Увы, я только что обнаружил, что этот не работает так хорошо, когда VC скрывается в MoreViewController (в отличие от четырех основных вкладок) . В таком случае мою галерею VC никогда не называют. Я думаю, это потому, что VC, который я звонил все это время, на самом деле является навигационным контроллером из выбранной вкладки, который затем передает вещи в соответствующий VC, в данном случае мою фотогалерею VC. Но для More VC это не так. Работать так хорошо ... ааа, и оттуда все идет под откос. : \

Я попытался использовать модификации Андреаса (см. В другом месте в этой ветке), но безрезультатно. Подсказки приветствуются!

3
ответ дан 8 December 2019 в 13:49
поделиться

Я столкнулся с теми же проблемами, что и ты, когда работал с UITabBarController. Мне нужно было контролировать, какие UIViewController разрешено вращать, а какие нет. Моя основная проблема была в закладке MORE. Я не хотел, чтобы какой-либо из UIViewControllers, включенных в закладку MORE, вращался.

Моим решением было создание собственного UITabBarController, который я назвал MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

Затем я реализовал метод shouldAutorotateToInterfaceOrientation:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

Мне нужно было узнать, выбрана ли вкладка MORE. Это двухступенчатый процесс; когда изначально выбрана закладка MORE, API возвращает selectIndex выше 4, поэтому мне нужно было сравнить выбранный контроллер с moreNavigationController.

Если UIViewController выбран в закладке MORE, то selectedIndex будет, наконец, 4, но selectedController больше не является moreNavigationController, а выбран UIViewController.

if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4)) позаботится об этом.

Теперь, когда я запускаю свое приложение, мои UIViewController во вкладке MORE не вращаются. Надеюсь, это поможет другим разработчикам, которые сталкиваются с теми же проблемами, что и я.

Эмилио

2
ответ дан 8 December 2019 в 13:49
поделиться

Спасибо, Спасибо, Спасибо. На то, чтобы понять, как это сделать, ушло 2 дня. Вот мой взгляд на всю вашу большую помощь, когда у вас есть tabBarController с navigationControllers.

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

Любая критика кода неофита всегда приветствуется ... jack

0
ответ дан 8 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: