3

「インスタンス0xに送信された認識されないセレクター」を取得していることを除いて、物事を整理するのに役立つ単純なTo Doリストアプリケーションである、最初の実際のiPhoneアプリに取り組んでいます。

具体的には:

2010-02-20 14:30:09.200 ToDoApp[88562:20b] *** -[NSCFDictionary switchViews:]: unrecognized selector sent to instance 0x3d22de0

2010-02-20 14:30:09.201 ToDoApp[88562:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFDictionary switchViews:]: unrecognized selector sent to instance 0x3d22de0'

私は周りを見回して、それがIBの接続の問題である可能性があることを理解しましたが、私はこの接続全体に慣れていないので(JavaまたはPythonをサポートしていればよかったのに)、それがどのようにレイアウトされているかを次に示します. SwitchViewController、MainScreenViewController、ToDoListViewController の 3 つのクラスがあります。MainScreenViewController のボタンを押すと、この問題を引き起こしている "switchViews" 関数がトリガーされます。私が設定した方法は、ボタン(UIBarButtonItem)に「sentAction」がswitchViewsに移動することです。この ViewButton には、SwitchViewController の IBOutlet として参照アウトレットがあります。

SVC の .h は次のとおりです。

#import <UIKit/UIKit.h>

@class MainScreenViewController;
@class ToDoListViewController;
@class EditViewController;

#define kMinimumGestureLength 25
#define kMaximumVariance 5

@interface SwitchViewController : UIViewController {
 MainScreenViewController *mainScreenViewController;
 ToDoListViewController *toDoListViewController;
 EditViewController *editViewController;
 IBOutlet UIBarButtonItem *viewButton;
 CGPoint gestureStartPoint;
}

@property (retain, nonatomic) MainScreenViewController *mainScreenViewController;
@property (retain, nonatomic) ToDoListViewController *toDoListViewController;
@property (retain, nonatomic) EditViewController *editViewController;
@property (retain, nonatomic) IBOutlet UIBarButtonItem *viewButton;
@property CGPoint gestureStartPoint;
-(IBAction)switchViews:(id)sender;  

switchViews 関数の場合:

-(IBAction) switchViews:(id)sender
{
 NSLog(@"Switching views");
 if(self.toDoListViewController.view.superview == nil){
  if(self.toDoListViewController ==nil){
   ToDoListViewController *toDoVC = [[ToDoListViewController alloc]     initWithNibName:@"ToDoListView" bundle:nil];
   self.toDoListViewController = toDoVC;
   //[toDoVC release];
  }
  [mainScreenViewController.view removeFromSuperview];
  [self.view insertSubview:toDoListViewController.view atIndex:0];
 }
 else{
  if(self.mainScreenViewController == nil){
   MainScreenViewController *mainController =     [[MainScreenViewController alloc] initWithNibName:@"MainScreenView" bundle:nil];
   self.mainScreenViewController = mainController;
   //[mainController release];
  }
  [toDoListViewController.view removeFromSuperview];
  [self.view insertSubview:mainScreenViewController.view atIndex:0];
 }
}

要するに、私は完全に道に迷っており、これは本当にイライラしています。誰にもアドバイスがありますか、それ以上のコードが必要ですか?

4

7 に答える 7

12

同じ問題に遭遇しました。AppDelegate で ViewController オブジェクトをリリースした後、nib ビューが (View Controller で) IBAction を呼び出そうとしたようです。半分の時間は「EXC_BAD_ACCESS」を受け取っていました (別名、リリースされたオブジェクトのメッセージ)、残りの半分の時間は、NSCFString、NSCFArray、あらゆる種類のものの「インスタンスに送信された認識されていないセレクター」を受け取っていました (別名、現在占有されているメモリ領域のメッセージ)別のオブジェクトによって)。

ViewController がリリースされていないことを確認してください。

于 2010-12-15T23:23:59.897 に答える
4

さて、解決策が私に指摘されました。FirstResponder を介してルーティングする必要がありました (なぜそれが機能するのかは本当にわかりませんが、現時点では機能することをうれしく思います。)

とにかく、ファーストレスポンダーがどのように機能するかはわかりませんが(私が実際に言及した本はありません)、それは...機能しますか?誰かが私に要約を与えたいと思ったら、それは役に立ちます...しかし、この質問には回答がありました.

于 2010-02-21T19:16:20.063 に答える
0

問題はあなたのnibファイルにあると推測します。

switchViewエラーは、ボタンをクリックすると、ボタンがメッセージ/メソッド呼び出しをNSDictionaryオブジェクトに送信しようとすることを意味します。NSDictionaryオブジェクトにはもちろんそのようなメソッドはありません。次に、ボタンアクションがポイントされている場所にエラーが発生します。

このビューのペン先を確認してください。ファイル所有者を見て、それに割り当てられているクラスを確認します。SwitchViewController何らかの理由で辞書ではなく、そうであることを確認してください。File Ownerプロパティがディクショナリクラスに設定されている場合、ディクショナリがロードされ、アクションメソッドがそれに送信されます。

于 2010-02-20T21:45:57.837 に答える
0

参考までに、ARCを使用していて、xibがロードされて画面に表示されていたときにこれを取得していましたが、どういうわけかVC自体が保持されていませんでした。

それを提示していたVCに参照を格納する変数を追加することで解決しました。

于 2013-02-05T04:27:12.417 に答える
0

正しい答えは次のとおりです。

アプリ デリゲートで最初の画面として割り当てたビュー コントローラーは、- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsメソッドで解放しないでください。あなたの場合、最初の画面はMainScreenViewController.

これ (MainScreenViewControllerインスタンス) は、アプリ デリゲートのdeallocメソッドで解放する必要があります。

- (void)dealloc
{
    [_window release];
    [mainScreenViewController release];
    [super dealloc];
}
于 2012-01-08T07:55:03.623 に答える
0

問題は、UIViewControllerインスタンスをメソッド変数として開始したことです。したがって、View Controller はメソッドの実行後にスコープを持たないため、メモリ サイクルから解放されます。そのため、View Controller インスタンスをクラス レベルとして作成する必要があります。

  @interface SwitchViewController () {
         ToDoListViewController *toDoVC;
         MainScreenViewController *mainController;
    }



-(IBAction) switchViews:(id)sender
{
     if (!toDoVC)
          toDoVC = [[ToDoListViewController alloc]     initWithNibName:@"ToDoListView" bundle:nil];
     if (!mainController)
          mainController =     [[MainScreenViewController alloc] initWithNibName:@"MainScreenView" bundle:nil];

 //Your stuff with the view controllers...
}
于 2014-11-25T06:08:30.027 に答える