Вы не можете запретить производному классу объявлять конструкторы копирования / перемещения, но их нельзя использовать по умолчанию: 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
теперь копируемый, несмотря на то, что его базовый класс - нет!
Это сработало для меня:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
return YES;
else
return NO;
}
Здесь ' 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
Я могу использовать это уже некоторое время (из контроллера панели вкладок моего приложения) без проблем:
- (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 это не так. Работать так хорошо ... ааа, и оттуда все идет под откос. : \
Я попытался использовать модификации Андреаса (см. В другом месте в этой ветке), но безрезультатно. Подсказки приветствуются!
Я столкнулся с теми же проблемами, что и ты, когда работал с 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 дня. Вот мой взгляд на всю вашу большую помощь, когда у вас есть 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