3

条件付きセグエを実行しようとしています。しかし、私は得る:

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel length]: unrecognized selector sent to instance 0x763c8e0'

ボタンを押すと、アプリが AFNetworking の AFJSONRequestOperation を使用してインターネットからデータを取得するように設計されています。リクエストが成功すると、現在の UIViewController から別の UIViewController が呼び出されます。このメソッドを使用して条件付き開始セグエを実行しました。以下は私のコードです。

-(void) login:(NSString*)pinString{    
NSString* urlString = [NSString stringWithFormat:@"%@%@%@", [super.serverResource getURL], [super.serverResource getRequestByKey:@"login"] ,pinString];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];    
AFJSONRequestOperation *operation = [MenuletJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    [self performSegueWithIdentifier:@"login" sender:self];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
    switch([response statusCode]){
        case (403):{
            UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Log in failed"
                                                      message:@"Log in denied, check your PIN."
                                                      delegate:nil cancelButtonTitle:@"OK"
                                                      otherButtonTitles:nil];
            [alert show];
            break;
        }
    }
}];
[operation start];

}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
SettingViewController *settingVC = (SettingViewController*)[storyboard instantiateViewControllerWithIdentifier:@"SettingViewController"];
[self presentViewController:settingVC animated:YES completion:nil];

}

そして、SettingViewController で "ViewDidLoad" を実行した後、上記の例外が発生します。条件付きセグエを使用せず、ボタンからIBのSettingViewControllerにctlドラッグするだけで、すべて正常に機能します...何か提案をお願いします...私は本当にアイデアがありません...

以下は、SettingViewController からの私のコードです。

- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view.
//StringResources* resource = [[StringResources alloc]init];
[self.titleLabel setText:[super.stringResource getStringByKey:@"screen_setting_title"]];
[self.createOrderLabel setText:[super.stringResource getStringByKey:@"screen_setting_create_order_label"]];
[self.refreshMenuLabel setText:[super.stringResource getStringByKey:@"screen_setting_refresh_menu_label"]];
[self.tableNumberLabel setText:[super.stringResource getStringByKey:@"screen_setting_table_number_label"]];

}

実際には、SettingViewController にはあまり何も入れていません。プログラムでラベルを設定するだけでした。そして、各 setText にブレークポイントを設定すると、それらはすべてエラーなしで実行されました。したがって、例外は ViewDidLoad の後に発生する必要があります...

エラーが発生する場所は次のとおりです。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); //error occur here
    }
}

解決済み... Segue がすべてを処理することを確認します。私がする必要があるのは、一般的なセグエをセットアップすることだけです。[self performSegueWithIdentifier:@"login" sender:self] を呼び出すと、すべてが完全に機能します。みなさん、ありがとう... (prepareForSegue をオーバーライドしても問題が発生するだけです...)

4

4 に答える 4

3

オプション 1: セグエを信頼する

セグエが現在のView ControllerからSettingViewControllerに移動していることを確認してください。

その後、あなたはキープし-performSegueWithIdentifier:sender:ます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   // load data from current view controller to segue.destinationViewController
}

オプション 2: モーダル ビュー コントローラーを手動で読み込む

セグエをすべて捨てて、ストーリーボードからView Controllerをロードするだけです。

AFJSONRequestOperation *operation = [MenuletJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    SettingViewController *settingVC = (SettingViewController*)[storyboard instantiateViewControllerWithIdentifier:@"SettingViewController"];
    // load data from current view controller to settingVC
    [self presentViewController:settingVC animated:YES completion:nil];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
    // Error handler
}];
于 2012-10-04T14:00:57.950 に答える
2

あなたがしたいことは、ViewController(オレンジ色の背景に白い四角形のアイコン)からクリックしてドラッグすることです。これにより、一般的なシークが作成されます。その後、コードから呼び出すことができます。prepareForSegue では、宛先 VC にアクセスできます。

  segue.destinationViewController

そこにデータをロードするか、必要なプロパティを設定します。これは、これを行うための推奨される方法だと思います。

于 2012-10-04T14:12:14.637 に答える
0

今日、私もこのエラーに遭遇しました。原因はわかりませんが、Xcode のバグだと思います。セグエを削除して再作成することで削除されました(Ctrlキーを押しながらviewcontrollerからviewcontrollerにドラッグします)。

私は Xcode が大好きですが、ときどき気が狂いそうになります。

于 2014-04-08T06:41:28.430 に答える
0

新しい VC の viewDidLoad で例外が発生するので、セグエが正しく機能していて、問題は新しい VC の実装にあると思います。

エラーが表示されました。UILabel オブジェクトのテキスト プロパティではなく、isEqualToString のような NSString 比較を直接使用していますか?

うーん..そのUILabelを参照するSettingViewControllerのコードを投稿してクラッシュを引き起こした場合、私たちはあなたを助けることができます.

于 2012-10-04T13:59:10.787 に答える