Я отчаянно пытаюсь уже 2 часа, чтобы найти ошибку в моем коде, которая отвечает за то, что мой SplitViewController, который я реализовал, не отображается. Странно то, что ошибки компиляции не отображаются и все ссылки и зависимости кажутся правильными.
При первой загрузке на экране ничего не отображается. Но когда я поворачиваю устройство, я вижу правильный вид. Но при включении вообще нет представления, хотя все представления подключены.
У меня только что часть заработала... С помощью отладчика я обнаружил, что первый контроллер представления не загружается при запуске. Таким образом, массив контроллеров представления для разделенного представления не заполнен начальным контроллером представления... как я могу это исправить?
Первой частью, которую я проверил, был мой AppDelegate:
#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize splitViewController = _splitViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
[[self window] addSubview:self.splitViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
@end
Контроллер первого представления
#import "FirstViewController.h"
@implementation FirstViewController
@synthesize toolbar;
#pragma mark -
#pragma mark View Lifecycle
- (void)viewDidUnload
{
[super viewDidUnload];
self.toolbar = nil;
}
#pragma mark -
#pragma mark Managing the Popover
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{
NSMutableArray *itemsArray = [toolbar.items mutableCopy];
[itemsArray insertObject:barButtonItem atIndex:0];
[toolbar setItems:itemsArray animated:NO];
}
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem
{
NSMutableArray *itemsArray = [toolbar.items mutableCopy];
[itemsArray removeObject:barButtonItem];
[toolbar setItems:itemsArray animated:NO];
}
#pragma mark -
#pragma mark Rotation support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
@end
Второй частью, которую я проверил, был мой RootViewController. Дело в том, что когда вы нажимаете на запись tableView, должен загружаться и отображаться новый контроллер представления. Поэтому я не создаю экземпляры VC в моем делегате приложения, а в методе делегата табличного представления «выбрал строку».
Это rootviewcontroller:
#import "RootViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation RootViewController
@synthesize popoverController, splitViewController, rootPopoverButtonItem;
#pragma mark -
#pragma mark View Lifecycle
- (void)viewDidLoad
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
[super viewDidLoad];
self.contentSizeForViewInPopover = CGSizeMake(310.0, self.tableView.rowHeight * 2.0);
}
- (void)viewDidUnload
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
[super viewDidUnload];
self.splitViewController = nil;
self.rootPopoverButtonItem = nil;
}
#pragma mark -
#pragma mark Rotation support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
return YES;
}
#pragma mark -
#pragma mark SplitViewController delegates
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
barButtonItem.title = @"PolyCube Prototypes";
self.popoverController = pc;
self.rootPopoverButtonItem = barButtonItem;
UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
[detailViewController showRootPopoverButtonItem:rootPopoverButtonItem];
}
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
self.popoverController = nil;
self.rootPopoverButtonItem = nil;
UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
[detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem];
}
#pragma mark -
#pragma mark Table View Data Source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
return 2;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
static NSString *CellIdentifier = @"RootViewControllerIdentifier";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if (indexPath.row == 0) {
cell.textLabel.text = @"PolyCube 1";
}
else {
cell.textLabel.text = @"PolyCube 2";
}
return cell;
}
#pragma mark -
#pragma mark - Table View Selection
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__);
NSUInteger row = indexPath.row;
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
if (row == 0) {
FirstViewController *newDetailViewController = [[FirstViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
detailViewController = newDetailViewController;
}
if (row == 1) {
SecondViewController *newDetailViewController = [[SecondViewController alloc] initWithNibName:@"SecondDetailView" bundle:nil];
detailViewController = newDetailViewController;
}
NSArray *vcs = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = vcs;
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
if (rootPopoverButtonItem != nil) {
[detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}
}
@end
Я был бы очень признателен за руку помощи... Я больше не знаю, где искать. Я даже проверил все соединения с IB... думаю, ничего страшного. Но все равно только белый экран.
Большое спасибо, Себастьян
1 ответ
Такое поведение ожидаемо. Если вы не установите делегата UISplitViewController, главный вид не будет отображаться в портретном режиме. Ваш основной вид никогда не загружается, а белый экран, который вы видите, — это ваш подробный вид.
Итак, вам нужно реализовать свой собственный UISplitViewController (создайте новый UIViewController и измените его на UISplitViewControlle. Не забудьте назначить его в Storyboard для вашего разделенного представления)
Также в интерфейсе сделайте его реализацию и в методе viewDidLoad установите делегата на себя.
Этот протокол подскажет, куда поместить мастер-таблицу. Вы хотите, чтобы это было как в режиме разделения, разделив окно? Или, возможно, вам нужна кнопка где-нибудь (обычно на панели вкладок), и когда вы нажимаете ее, всплывает главное окно?
Например, реализуйте этого парня, чтобы главный вид всегда был виден:
ИНТЕРФЕЙС:
#import <UIKit/UIKit.h>
@interface SplitViewController : UISplitViewController <UISplitViewControllerDelegate>
@end
РЕАЛИЗАЦИЯ
#import "SplitViewController.h"
@interface SplitViewController ()
@end
@implementation SplitViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self setDelegate:self];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation{
return NO;
}
@end
Если вам не хочется реализовывать свой собственный UISplitViewController только для обработки делегата, вы также можете сделать любой из ваших главных или подробных контроллеров для его реализации и назначить его в раскадровке (попробуйте Ctrl и перетащите из разделенного представления в любой из ваших контроллер и установка его как делегата, не забудьте сначала реализовать протокол)
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].