Подклассы?UITabBarController не будет автоматически - PullRequest
0 голосов
/ 11 мая 2011

Noobie, так терпите меня.

Я следил за программированием O'Rielyy Learning для iPhone и различными темами здесь, чтобы создать свое первое приложение для iPhone.Пока все хорошо, но последний камень преткновения в конце проектов - заставить приложение автоматически поворачиваться (бета-версия, использующая только uiwebviews, была отклонена из-за отсутствия автоматического поворота)

У меня есть почтовый делегат приложения, который добавляетUITabBarController

// myNewsUKDelegate.h
@interface myNewsUKDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end

// myNewsUKDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    return YES;
}

Для tabBarController есть файлы .h и .m - я добавил все контроллеры UINavigationController в IB, которые, в свою очередь, добавляют UITableView

См. Изображение на http://flatearth.co.uk/nib.png (слишком noob, чтобы публиковать изображения в вопросах!)

Из моего прочтения я понимаю, что проблема заключается в UITabBarController, который я добавил в главное представление, должен быть 'subclassed' и добавить этот код.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Следующее представление down / in / subclassed (независимо от правильной терминологии), в котором есть файлы .h и .m, - это FirstViewController, который добавляет представление таблицы, для него должен быть уже установлен флажокAutorotateToInterfaceOrientation.

@interface FirstViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    UITableView *tableView;
    NSArray *userList;
}
@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (nonatomic, retain) NSArray *userList;
@end

@implementation FirstViewController

@synthesize tableView;

- (void)viewDidLoad {
    [super viewDidLoad];
    // I tried adding
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    // lots of other code ; )
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

Таким образом, проблема заключается в том, что когда [self.window addSubview: tabBarController.view];добавляет панель вкладок, но не добавляет shouldAutorotateToInterfaceOrientation, возвращающее бит YES.

Похоже, мне нужно добавить подкласс tabBarController, в котором должен быть mustAutorotateToInterfaceOrientation.Итак, я прочитал и попробовал это, как это было предложено в паутинах ...

//  tabBarController.h
#import <UIKit/UIKit.h>
@interface tabBarController : UITabBarController {

}
@end

//  tabBarController.m
#import "tabBarController.h"
@implementation tabBarController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

и добавив

#import "tabBarController.h"

к myNewsUKDelegate.m

Но это не удается с"ошибка: доступ к неизвестному методу класса 'view'" в строке

[self.window addSubview:tabBarController.view];

в myNewsUKDelegate.m

Дальнейший поиск не дал ничего полезного, и мои последние знания Xcode теперь иссякли: (Любая помощь приветствуется.

Ответы [ 2 ]

8 голосов
/ 11 мая 2011

Из моего прочтения я понимаю, что проблема заключается в UITabBarController, который я добавил в главное представление, должен быть «разделен на подклассы» и иметь добавленный этот код.нужно сделать это.Контроллер панели вкладок определяет, поддерживает ли он определенную ориентацию интерфейса, или спрашивая all его дочерних контроллеров, поддерживают ли они эту ориентацию.В вашем случае это кажется навигационными контроллерами, которые в свою очередь спрашивают свой текущий дочерний контроллер, поддерживает ли он ориентацию.

Другими словами, вы должны убедиться, что все ваши пользовательские контроллеры представления возвращают YESдля желаемой ориентации интерфейса.

0 голосов
/ 11 мая 2011

Вам не нужен подкласс, вам нужна категория на UITabBarController. По сути, вы создаете файл с именем UITabBarController + Autoresize.h (и .m)

В .ч: ​​

#import <UIKit/UIKit.h>

@interface UITabBarController (Autoresize) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
@end

в .м:

#import "UITabBarController + Autoresize.h"

@implementation UITabBarController (Autoresize)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{   
    //do custom checks here if you only want to autorotate it in certain views or whatever
}
@end

но, как указал другой автор, ВСЕ родительские виды вида, который вы хотите повернуть, должны поддерживать вращение.

...