0

まず、私はiOSとObjective-Cプログラミングに不慣れです(1か月前に始めました)。

カスタムtabBarを実行しようとしていますが、iOS5.1.1を搭載したiPhone4ではうまく機能しますが、iOS4.2.1を搭載した3GSでは機能しません。電話モデルではなくiOSバージョンに関連するものかどうかを確認するために更新しますが、テストを行うためにiOS4で使用することをお勧めします。

  • まず、誰かがこのクラッシュの原因とそれを回避する方法を理解するのを手伝ってくれたらとてもうれしいです。コールスタックに示されているように、私のviewControllerはに応答しないようですが、iOS5では機能していtransitionFromViewController:toViewController:duration:options:animations:completion:ます...iOS 4にはない新しい機能でしょうか?そして、これがちょうど起こっていることである場合、このセレクターなしでviewControllerから別のviewControllerに移行するにはどうすればよいですか?

  • 次に、私がそれを正しい方法で行っているかどうかを知りたいです。前に述べたように、私が欲しいのは私自身のカスタムTabBarです。私がやったことは、5つのボタンを持つviewControllerを作成することで、画面のほぼ全体が、押されたボタンに応じて対応するviewControllerをロードするためのアウトレットを備えたビューです。例えば:

-ヘッダー:

//  CustomTabBarViewController.h
#import <UIKit/UIKit.h>
#import "Tab1ViewController.h"

@interface TabBarCustomViewController : UIViewController

// View Controllers
@property (retain, nonatomic) Tab1ViewController *myTab1ViewController;
@property (retain, nonatomic) Tab2ViewController *myTab2ViewController;

// Reference of the current shown viewController, for the transitions
@property (retain, nonatomic) UIViewController *currentViewController; 

// Outlet to switch the viewController inside the view mainView;
@property (retain, nonatomic) IBOutlet UIView *mainView;

-.mファイル

#import "TabBarCustomViewController.h"

@interface TabBarCustomViewController ()

@end

@implementation TabBarCustomViewController

@synthesize myTab1ViewController, myTab2ViewController;
@synthesize currentViewController;
@synthesize mainView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    //Instantiation of the viewControllers
    self.myTab1ViewController = [[Tab1ViewController alloc]initWithNibName:@"Tab1ViewController" bundle:nil];
    self.myTab2ViewController = [[Tab2ViewController alloc]initWithNibName:@"Tab2ViewController" bundle:nil];


    // Adding those viewControllers to the root viewController  
    [self addChildViewController:self.myTab1ViewController];
    [self addChildViewController:self.myTab2ViewController];


    //the entry view
    [mainView addSubview:self.myTab1ViewController.view];
    currentViewController = self.myTab1ViewController;   
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. myOutlet = nil;
}

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


// My methods

- (IBAction)tab1Pressed
{
    NSLog(@"tab1Pressed");

    [self transitionFromViewController:currentViewController toViewController:self.myTab1ViewController duration:0.2    options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];

    // Updating the reference of which viewController is currently being displayed
    currentViewController = myTab1ViewController;
}

- (IBAction)tab2Pressed
{
    NSLog(@"tab2Pressed");

    [self transitionFromViewController:currentViewController toViewController:self.myTab2ViewController duration:0.2    options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];

    // Updating the reference of which viewController is currently being displayed
    currentViewController = myTab2ViewController;
}

@end

-これは、最初のポイントで説明したクラッシュが発生したときにコンソールにスローされるものです。

2012-06-08 08:25:55.991 myTabBar[4597:307] tab2Pressed
2012-06-08 08:25:56.003 myTabBar[4597:307] -[TabBarCustomViewController transitionFromViewController:toViewController:duration:options:animations:completion:]: unrecognized selector sent to instance 0x143cc0
2012-06-08 08:25:56.028 myTabBar[4597:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TabBarCustomViewController transitionFromViewController:toViewController:duration:options:animations:completion:]: unrecognized selector sent to instance 0x143cc0'
*** Call stack at first throw:
(
0   CoreFoundation                      0x314d0987 __exceptionPreprocess + 114
1   libobjc.A.dylib                     0x319a149d objc_exception_throw + 24
2   CoreFoundation                      0x314d2133 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
3   CoreFoundation                      0x31479aa9 ___forwarding___ + 508
4   CoreFoundation                      0x31479860 _CF_forwarding_prep_0 + 48
5   myTabBar                            0x00003707 -[TabBarCustomViewController tab2Pressed] + 126
6   CoreFoundation                      0x31477fed -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
7   UIKit                               0x338c14ad -[UIApplication sendAction:to:from:forEvent:] + 84
8   UIKit                               0x338c144d -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
9   UIKit                               0x338c141f -[UIControl sendAction:to:forEvent:] + 38
10  UIKit                               0x338c1171 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 356
11  UIKit                               0x338c19cf -[UIControl touchesEnded:withEvent:] + 342
12  UIKit                               0x338b7355 -[UIWindow _sendTouchesForEvent:] + 368
13  UIKit                               0x338b6ccf -[UIWindow sendEvent:] + 262
14  UIKit                               0x338a1fc7 -[UIApplication sendEvent:] + 298
15  UIKit                               0x338a1907 _UIApplicationHandleEvent + 5090
16  GraphicsServices                    0x35d66f03 PurpleEventCallback + 666
17  CoreFoundation                      0x314656ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
18  CoreFoundation                      0x314656c3 __CFRunLoopDoSource1 + 166
19  CoreFoundation                      0x31457f7d __CFRunLoopRun + 520
20  CoreFoundation                      0x31457c87 CFRunLoopRunSpecific + 230
21  CoreFoundation                      0x31457b8f CFRunLoopRunInMode + 58
22  GraphicsServices                    0x35d664ab GSEventRunModal + 114
23  GraphicsServices                    0x35d66557 GSEventRun + 62
24  UIKit                               0x338d5329 -[UIApplication _run] + 412
25  UIKit                               0x338d2e93 UIApplicationMain + 670
26  myTabBar                            0x000027cb main + 102
27  myTabBar                            0x00002760 start + 40
)
terminate called after throwing an instance of 'NSException'
(lldb) 

[mainView addSubview:myTab1ViewController.view]; 代わりに使用できることを知っています[self transitionFromViewController:currentViewController toViewController:self.myTab2ViewController duration:0.2 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil];

しかし、この方法では、トランジションアニメーションを実行できません。さらに、それが自分のやりたいことを実行する適切な方法であるかどうかもわかりません。

前もって感謝します!

4

1 に答える 1

2

公式ドキュメントによると: http ://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/transitionFromViewController:toViewController:duration:options :animations:completion

transitionFromViewController:toViewController:duration:options:animations:completionが利用可能です:

可用性
iOS5.0以降で利用できます。

unrecognized selector sent to instanceしたがって、iOS5.0より前のすべてのバージョンで期待できます

カスタムタブバーについては、次の投稿をチェックアウトすることをお勧めします:http:
//mobiledevelopertips.com/open-source/ios-open-source-custom-tabbar-controller-bctabbarcontroller.html
https://stackoverflow.com/a/4912328/ 200272

于 2012-06-08T08:09:04.257 に答える