iOS: включение / выключение слайд-шоу UIView

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

Моя установка
1. Я использую шаблон приложения с одним представлением в Xcode 4.
2. В представление «main / border» xib я добавил 2 UIViews (LeftPanel и RightPanel) и UIButton (ShowHideButton).
3. Я покрасил левую панель в зеленый цвет, а правую - в синий для большей наглядности.
4. Когда представление загружено, обе панели видны, а в UIButton отображается текст «Скрыть панель».
5. После нажатия кнопки LeftPanel должна соскользнуть с экрана (влево), а RightPanel должна расшириться, чтобы занять свое исходное пространство плюс пространство, освобожденное LeftPanel.
6. На этом этапе ShowHideButton должен изменить свой текст на «Показать панель».
7. При повторном нажатии кнопки LeftPanel должна скользить обратно на экран (слева), а RightPanel должна сжаться, чтобы «вернуть» исходное пространство.
8. На этом этапе ShowHideButton должен изменить свой текст обратно на «Скрыть панель».

Я реализую анимацию, используя animateWithDuration: animations: Завершение: . Пока что при переходе OFF экран работает нормально (очень хорошо, собственно).

Меня беспокоит то, что когда я затем пытаюсь "вернуть" LeftPanel, я получаю EXC_BAD_ACCESS. Я разместил свой код ниже и посмотрел на него, но я действительно не вижу, к чему я обращаюсь, что было выпущено (или что-то еще, что вызывает EXC_BAD_ACCESS).

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

typedef enum {
    kHidden,
    kShown
} PanelState;

@interface DrawerTestingViewController : UIViewController {

    PanelState   currentState;

    UIButton    *showHideButton;

    UIView      *leftPanel;
    UIView      *rightPanel;
}

@property (assign, nonatomic)          PanelState   CurrentState;

@property (strong, nonatomic) IBOutlet UIButton     *ShowHideButton;

@property (strong, nonatomic) IBOutlet UIView       *LeftPanel;
@property (strong, nonatomic) IBOutlet UIView       *RightPanel;

- (IBAction)showHidePressed:(id)sender;

@end


DrawerTestingViewController.m
#import "DrawerTestingViewController.h"

@implementation DrawerTestingViewController

@synthesize CurrentState    = currentState;
@synthesize LeftPanel       = leftPanel;
@synthesize RightPanel      = rightPanel;
@synthesize ShowHideButton  = showHideButton;

#pragma mark - My Methods

- (IBAction)showHidePressed:(id)sender
{
    switch ([self CurrentState]) {
        case kShown:
            // Hide the panel and change the button's text
            // 1. Hide the panel
            [UIView animateWithDuration:0.5 
                animations:^{
                // b. Move left panel from (0, 0, w, h) to (-w, 0, w, h)
                CGRect currLeftPanelRect = [[self LeftPanel] frame];
                currLeftPanelRect.origin.x = -1 * currLeftPanelRect.size.width;
                [[self LeftPanel] setFrame:currLeftPanelRect];
                // c. Expand right panel from (x, 0, w, h) to (0, 0, w + x, h)
                CGRect currRightPanelRect = [[self RightPanel] frame];
                currRightPanelRect.origin.x = 0;
                currRightPanelRect.size.width += currLeftPanelRect.size.width;
                [[self RightPanel] setFrame:currRightPanelRect];}
                completion:NULL];
            // 2. Change the button's text
            [[self ShowHideButton] setTitle:@"Show Panel" forState:UIControlStateNormal];
            // 3. Flip [self CurrentState]
            [self setCurrentState:kHidden];
            break;
        case kHidden:
            // Show the panel and change the button's text
            // 1. Show the panel
            [UIView animateWithDuration:0.5 
                animations:^{
                // b. Move left panel from (-w, 0, w, h) to (0, 0, w, h)
                CGRect currLeftPanelRect = [[self LeftPanel] frame];
                currLeftPanelRect.origin.x = 0;
                [[self LeftPanel] setFrame:currLeftPanelRect];
                // c. Expand right panel from (0, 0, w, h) to (leftWidth, 0, w - leftWidth, h)
                CGRect currRightPanelRect = [[self RightPanel] frame];
                currRightPanelRect.origin.x = currLeftPanelRect.size.width;
                currRightPanelRect.size.width -= currLeftPanelRect.size.width;
                [[self RightPanel] setFrame:currRightPanelRect];}
                completion:NULL];
            // 2. Change the button's text
            [[self ShowHideButton] setTitle:@"Hide Panel" forState:UIControlStateNormal];
            // 3. Flip [self CurrentState]
            [self setCurrentState:kShown];
            break;
        default:
            break;
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setCurrentState:kShown];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    switch ([self CurrentState]) {
        case kShown:
            [[self ShowHideButton] setTitle:@"Hide Panel" forState:UIControlStateNormal];
            break;
        case kHidden:
            [[self ShowHideButton] setTitle:@"Show Panel" forState:UIControlStateNormal];
            break;
        default:
            break;
    }
}

@end

Я упустил что-то сверхосновное? Кто-нибудь может помочь?

Спасибо!

Изменить: Я пробовал еще 2 вещи:
1. Проблема, похоже, связана с выводом на экран внеэкранного режима, поскольку запуск с левой панели вне экрана вызывает у меня ту же проблему.
2. Пошаговое выполнение кода приводит к сбою Xcode (4 Beta для Lion). Вот подробности (одинаковые для каждого сбоя):

ASSERTION FAILURE в /SourceCache/DVTFoundation/DVTFoundation-867/Framework/Classes/FilePaths/DVTFilePath.m:373 Подробности: пустая строка не является допустимым путем Объект: Метод: + _filePathForParent: fileSystemRepresentation: length: allowCreation: Тема: {name = (null),число = 55} Подсказки: нет Обратная трассировка: 0 0x00000001068719a6 - [IDEAssertionHandler handleFailureInMethod: object: fileName: lineNumber: messageFormat: arguments:] (в IDEKit) 1 0x0000000105f3e324 _DVTAssertionFailureHandler (в DVTFoundation) 2 0x0000000105edd16f + [DVTFilePath _filePathForParent: fileSystemRepresentation: length: allowCreation:] (в DVTFoundation) 3 0x0000000105edcd4d + [DVTFilePath _filePathForParent: pathString:] (в DVTFoundation) 4 0x0000000105ede141 + [DVTFilePath filePathForPathString:] (в DVTFoundation) 5 0x00000001064a8dde - [IDEIndex queryProviderForFile: highPriority:] (в IDEFoundation) 6 0x000000010655193b - [IDEIndex (IDEIndexQueries) symbolsMatchingName: inContext: withCurrentFileContentDictionary:] (в IDEFoundation) 7 0x000000010aca6166 __68- [IDESourceCodeEditor symbolsForExpression: inQueue: completionBlock:] _ block_invoke_01561 (в IDESourceEditor) 8 0x00007fff93fb490a _dispatch_call_block_and_release (в libdispatch.dylib) 9 0x00007fff93fb615a _dispatch_queue_drain (в libdispatch.dylib) 10 0x00007fff93fb5fb6 _dispatch_queue_invoke (в libdispatch.dylib) 11 0x00007fff93fb57b0 _dispatch_worker_thread2 (в libdispatch.dylib) 12 0x00007fff8bb5e3da _pthread_wqthread (в libsystem_c.dylib) 13 0x00007fff8bb5fb85 start_wqthread (в libsystem_c.dylib)

Обновление: снимки экрана
Показана панель (состояние запуска) Panel Shown
Панель скрыта (успешный переход после нажатия кнопки) Panel Hidden
Ошибка: повторное нажатие кнопки вызывает сбой. Error


10
задан mbm29414 29 July 2011 в 15:28
поделиться