まず、私は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];
しかし、この方法では、トランジションアニメーションを実行できません。さらに、それが自分のやりたいことを実行する適切な方法であるかどうかもわかりません。
前もって感謝します!