UISplitViewController делегат в одиночном - PullRequest
8 голосов
/ 22 февраля 2012

Я провел много исследований по UISplitView и не смог найти способ управления разделенным видом, когда мастер и деталь имеют изменяющееся представление.

Затем я нашел способуправляйте им с помощью одноэлементного класса, который является делегатом.

Моя проблема в том, что я не уверен, что это правильный путь.Я беспокоюсь о reusability и memory managment.Кроме того, у меня есть ощущение, что Apple руководствуется рекомендациями делать делегатов одиночными.

Это то, что у меня есть (и на самом деле это работает):

//  SharedSplitViewDelegate.h

/* In the detail view controllers:

 // in the initial detail view controller
 - (void)awakeFromNib
 {
 [super awakeFromNib];
 // needs to be here, otherwise if it's booted in portrait the button is not set
 self.splitViewController.delegate = [SharedSplitViewDelegate initSharedSplitViewDelegate];
 }

 // shared between all detail view controllers
 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
 {
 SharedSplitViewDelegate *rotationHandler = [SharedSplitViewDelegate initSharedSplitViewDelegate];
 [self.toolbar setItems:[rotationHandler processButtonArray:self.toolbar.items] animated:YES];
 }

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

 */

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface SharedSplitViewDelegate : NSObject <UISplitViewControllerDelegate>

+ (id)initSharedSplitViewDelegate; // returns the singleton class instance

- (NSArray *)processButtonArray:(NSArray *)array; // Adds and removes the button from the toolbar array. Returns the modified array.

@end

Теперь реализация:

//  SharedSplitViewDelegate.m

#import "SharedSplitViewDelegate.h"

@interface SharedSplitViewDelegate()
@property (nonatomic, strong) UIBarButtonItem *button;
@property (nonatomic, strong) UIBarButtonItem *cachedButton;
@end

@implementation SharedSplitViewDelegate

@synthesize button = _button;
@synthesize cachedButton = _cachedButton;

#pragma mark - Singleton class definition

static id sharedSplitViewDelegate = nil;

+ (void)initialize
{    
    if (self == [SharedSplitViewDelegate class]) {
        sharedSplitViewDelegate = [[self alloc] init];
    }
}

+ (id)initSharedSplitViewDelegate {
    return sharedSplitViewDelegate;
}

#pragma mark - Split view delegate methods

- (BOOL)splitViewController:(UISplitViewController *)svc
   shouldHideViewController:(UIViewController *)vc
              inOrientation:(UIInterfaceOrientation)orientation
{
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        return NO;
    } else {
        return YES;
    }
}

- (void)splitViewController:(UISplitViewController *)svc
     willHideViewController:(UIViewController *)aViewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPopoverController *)pc
{
    barButtonItem.title = @"Browse";
    self.button = barButtonItem;
}

- (void)splitViewController:(UISplitViewController *)svc
     willShowViewController:(UIViewController *)aViewController
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    self.button = nil;
}

#pragma mark - Utility methods

- (void)setButton:(UIBarButtonItem *)button
{
    if (button != _button) {
        _button = button;
    }

    if (button != nil) {
        self.cachedButton = button;
    }
}

- (NSArray *)processButtonArray:(NSArray *)array
{
    NSMutableArray *processedArray = [array mutableCopy];
    if (self.button != nil && ![processedArray containsObject:self.button]) {
        [processedArray insertObject:self.button atIndex:0];
    } else if (self.button == nil && [processedArray containsObject:self.cachedButton]) {
        [processedArray removeObjectAtIndex:0];
    }

    return [processedArray copy];
}

@end

Этот код можно использовать и изменять бесплатно для всех, кто посчитает его жизнеспособным в своем проекте:).

Я новичок в StackOverflow (хотя я и скрывался пару месяцевбез учета), поэтому любая критика горячо приветствуется.

Ответы [ 2 ]

2 голосов
/ 08 января 2013

ИМХО, каждый шаблон проектирования, архитектура «хорош», если он соответствует «задаче», которую вы должны решить (и соответствует вашим личным предпочтениям при организации кода)

  • В чем ваша проблема?
  • Зачем вам нужен этот объект?
  • Может ли этот синглтон UISplitViewDelegate быть вашим UIApplicationDelegate?(Сохраняйте это простым; -)

дальнейшее обсуждение =>

Если у вас UIApplicationDelegate беспорядок, а не создание подобъекта, схемаНедавно я использовал для организации своего кода: использование категорий и расширений классов

Пример:

Если мой класс ViewController обрабатывает сложные задачи, чьиКод можно разделить на группы.
скажем:

  • звук
  • основные данные
  • с учетом местоположения,

Я создаю категорию для каждого изэти

  • UIViewController+soundManager
  • UIViewController+dataProvider
  • UIViewController+locationManager.

(в одном файле с несколькими @interface @реализации, или в разных файлах => я использую несколько файлов)

Затем вместе с каждой категорией я пишу расширение класса для свойств, в которых нуждается эта конкретная категория.

0 голосов
/ 23 июля 2013

В прошлый раз я решил эту проблему с помощью подкласса UISplitViewController и использовал в качестве своего собственного делегата .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...